代码之家  ›  专栏  ›  技术社区  ›  Jeff

MSTestMethod依赖项注入

  •  6
  • Jeff  · 技术社区  · 14 年前

    我使用的是一个DI容器,我想用容器中解析的实例进行MSTest(VS 2010)单元测试。

    现在,我的测试方法直接调用 container.Resolve<T>(xxx) 我更愿意避免这种情况,这样我的注射测试就更现实了。

    有人有这方面的经验吗?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Darin Dimitrov    14 年前

        2
  •  5
  •   jpvantuyl    10 年前

    对我来说,根据依赖注入模式编写代码并使用IoC框架的主要原因是为了获得可测试的代码。但是,在测试代码中使用IoC容器将得到相反的结果。从你的问题中我可以看出你已经经历了这一点。

    当使用服务定位器(SL)模式而不是依赖注入(DI)模式时,这尤其是一个问题。使用SL模式,类直接调用IoC容器(或此类容器的抽象),而不是向类提供所需的依赖项(使用构造函数注入)。因为类直接调用容器,所以您还需要在测试环境中配置该容器。这是痛苦的,因为测试配置或伪对象往往变得非常复杂,因为您经常希望在每个测试的基础上影响伪对象的行为,同时保持线程安全,因为测试框架可能并行运行您的测试(MSTest就是这样做的)。我知道我以前写过一些疯狂的线程安全测试代码,直到我发现我做的都是错的:-(。

    因此,您应该在应用程序代码中使用DI模式,并在测试中手动连接这些依赖项。例如,当对一个 HomeController ICustomerService 类,您通常应该具有 CreateController() CreateValidController 家庭控制器 FakeCustomerService 通过执行以下操作手动初始化:

    private static HomeController CreateController(
        InMemoryDataMapper mapper)
    {
        var uowFactory = new FakeNorthwindUnitOfWorkFactory()
        {
            UnitOfWork = new NorthwindUnitOfWork(mapper);
        };
    
        return new HomeController(new FakeCustomerService(uowFactory));
    }
    

    家庭控制器 看起来像。