谁在测试类项目中实例化测试类?

时间:2017-07-30 08:15:28

标签: c# unit-testing dependency-injection castle-windsor activator

我正在编写一些集成测试。我正在使用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

1 个答案:

答案 0 :(得分:0)

答案是:您的测试框架确实如此。据我所知,通用测试框架都不允许您控制创建测试类。

此处有关于此的更多信息:

A .NET Unit Test without a parameterless constructor, to facilitate dependency injection

NUnit提供ParameterizedTestFixture - https://github.com/nunit/docs/wiki/TestFixtureData

因此,理论上作为一种肮脏的解决方法,您可以通过构造函数注入一些依赖项,但它不是为此目的而设计的。

一般来说,你必须去服务定位器。