在努力坚持d在SOLID
依赖倒置原则,在 一个应“取决于抽象。不依赖于结核
为一个项目。在这种情况下,我想要一种方法来确保所有控制器(MVC和WebAPI2)都遵循这种模式,而不依赖于结核。
最初的想法从文章来我读了其中一个单元测试创建扫描所有控制器,以确保他们有明确的授权规定。我在检查所有控制器都有依赖于抽象的构造函数时采用了类似的思路。
[TestClass]
public class ControllerDependencyTests : ControllerUnitTests {
[TestMethod]
public void All_Controllers_Should_Depend_Upon_Abstractions() {
var controllers = UnitTestHelper.GetAssemblySources() //note this is custom code to get the assemblies to reflect.
.SelectMany(assembly => assembly.GetTypes())
.Where(t => typeof(IController).IsAssignableFrom(t) || typeof(System.Web.Http.Controllers.IHttpController).IsAssignableFrom(t));
var constructors = controllers
.SelectMany(type => type.GetConstructors())
.Where(constructor => {
var parameters = constructor.GetParameters();
var result = constructor.IsPublic
&& parameters.Length > 0
&& parameters.Any(arg => arg.ParameterType.IsClass && !arg.ParameterType.IsAbstract);
return result;
});
// produce a test failure error mssage if any controllers are uncovered
if (constructors.Any()) {
var errorStrings = constructors
.Select(c => {
var parameters = string.Join(", ", c.GetParameters().Select(p => string.Format("{0} {1}", p.ParameterType.Name, p.Name)));
var ctor = string.Format("{0}({1})", c.DeclaringType.Name, parameters);
return ctor;
}).Distinct();
Assert.Fail(String.Format("\nType depends on concretion instead of its abstraction.\n{0} Found :\n{1}",
errorStrings.Count(),
String.Join(Environment.NewLine, errorStrings)));
}
}
}
因此给出以下示例。 (请注意我适应这MVC)
public class MovementController : Controller {
public MovementController(MotorController motorController) {
//...
}
}
public interface IMotorController {
//...
}
public class MotorController : IMotorController {
//...
}
与...
Result Message: Assert.Fail failed.
Type depends on concretion instead of its abstraction.
1 Found :
MovementController(MotorController motorController)
这为我工作,因为我有一个常见的类型,以寻找与IController
和ApiController
单元测试会失败。
有空间上的测试改进,但应该是你一个很好的起点。
让我们来看看是我的理解:你想一个单元测试来检查你的控制器只有接口构造函数的参数?这是什么样的项目? MVC,winform,wpf ...? – Nkosi