我正在编写一些集成测试。我正在使用Windsor Castle的依赖注入。
我想使用控件容器的反转来解决测试类。我不认为解决测试类中的所有依赖关系是我案例的解决方案。
我想做我在web api项目中所做的事情。我实现了IHttpControllerActivator
,这是一个完全控制控制器生命周期的扩展点。也就是说,我们可以定义控制器的实例化方式。
我想对测试做同样的事情。但我不明白我必须实现哪个接口。任何人都可以帮助我吗?
我想我只需要知道哪个是单位测试的相应IHttpControllerActivator
。
修改
我有一个web api项目要测试。 web api项目使用WindsorCastle解析所有依赖项。现在我需要测试web api。这就是我在做的事情:
public voi MyTest_Ok()
{
//Arrange
var myController = new MyWebApiController();
var result = await myController.DoWork();
//Asserts
}
显然它不起作用,因为我没有使用城堡windsor来解析控制器,所以我没有解决从web api控制器到底部的任何依赖。
我想我可以替换这一行
var myController = new MyWebApiController();
有这样的东西
var myController = windsorContainer.Resolve<MyWebApiController>();
但我认为这个解决方案是错误的。我认为在控制器内部解决依赖关系会更好:
public class MyWebApiController : ApiController()
{
public InjectedDependency dep { get; set; }
public DoWork()
{
dep.DoWork();
}
}
我可以这样做,因为我已经实现了自定义IHttpControllerActivator
。
答案 0 :(得分:0)
答案是:您的测试框架确实如此。据我所知,通用测试框架都不允许您控制创建测试类。
此处有关于此的更多信息:
A .NET Unit Test without a parameterless constructor, to facilitate dependency injection
NUnit提供ParameterizedTestFixture - https://github.com/nunit/docs/wiki/TestFixtureData
因此,理论上作为一种肮脏的解决方法,您可以通过构造函数注入一些依赖项,但它不是为此目的而设计的。
一般来说,你必须去服务定位器。