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

nunit集成测试和依赖注入

  •  5
  • DanP  · 技术社区  · 14 年前

    我目前正在使用Castle Windsor 2.1版本作为容器,并希望使用它注册的服务执行集成测试。

    目前,我使用 Common Service Locator 要检索我的服务实例并对其执行集成测试,请执行以下操作:

    var myService = ServiceLocator.Current.GetInstance<IMyService>();
    // do stuff with myService
    

    理想情况下,我希望将我的服务依赖项自动注入到我的nunit测试夹具中。春天似乎提供了 this functionality 但是我找不到类似的城堡。

    有人能给我指出正确的方向吗?

    编辑:

    我相信每个人都对这是否是一个 好的 想法;让我们假设是在这种情况下……有人能告诉我这是怎么回事吗? 能够 使用温莎完成?

    2 回复  |  直到 13 年前
        1
  •  5
  •   Mauricio Scheffer    14 年前

    如果你从Spring/Spring.net来到温莎,你会发现有很多事情这些项目并不一致。这是其中之一。作为温莎的拥护者,我从不使用像Spring的AbstractDependencyInjectionsPringContextTests这样的东西。在测试中注入东西似乎是错误的,但正如我所说,我又有偏见。

    如果您想进行集成测试,只需创建一个新的容器实例,添加您需要的任何组件,并运行您想要测试的任何组件,例如:

    [Test]
    public void TestComponentThatDependsOnA() {
      var container = new WindsorContainer();
      container.Register(Component.For<MyComponentA>());
      container.Register(Component.For<ComponentThatDependsOnA>());
      var a = container.Resolve<ComponentThatDependsOnA>();
      var result = a.DoSomething();
      Assert.AreEqual("ok", result);
    }
    

    如果你的注册卡包装整齐 installers (正如您应该的那样)您可以在测试中重用它们,使测试更加简洁。

    如果您有XML配置,可以很容易地用configuration.fromxmlfile()加载它。

    此外,这里不需要使用公共服务定位器。

    对于某些集成测试也有用的是 auto-mocking container ,这将自动模拟服务(当然,除非您用具体的服务覆盖它们)。

        2
  •  0
  •   uttamkini    13 年前

    我想你也可以和卡斯尔一起做。WindsorInstaller是一个通用接口,可用于初始化容器/注册组件。然后,根据应用程序执行的上下文,您可以根据需要多次实现此接口。 您可以有一个安装程序在生产环境中注入实际对象,另一个安装程序为集成测试注入模拟对象/测试双重对象。

    有关更多信息,请访问 http://docs.castleproject.org/Windsor.Installers.ashx