【问题标题】:NUnit integration tests and dependency injectionNUnit 集成测试和依赖注入
【发布时间】:2010-10-14 14:04:19
【问题描述】:

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

目前,我使用Common Service Locator 来检索我的服务实例并对其执行集成测试:

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

我最理想的做法是让我的服务依赖项自动注入到我的 NUnit 测试装置中。 Spring 似乎提供了this functionality,但我无法使用 Castle 找到类似的东西。

谁能指出我正确的方向?

编辑:

我相信每个人都对这是否是一个好的想法有(有效的)观点;让我们假设它是在这种情况下...谁能告诉我这如何使用 Windsor 来完成?

【问题讨论】:

  • 单元测试需要您的服务吗?您是否尝试过使用 Moq、RhinoMocks 或 NMock 等模拟框架?如果您确实在测试组件和服务之间的集成,那么只需根据需要创建尽可能多的 Castle 配置文件,并使用 XmlConfigurator 在您的普通或自定义 Castle 容器中加载它们
  • @johnny g:我正在执行集成测试;这意味着我不想使用模拟,而是使用实际服务及其所有实际依赖项。按照您的建议,我在单元测试装置中使用了模拟。
  • 哎呀!这很尴尬 - 阅读 NUnit 并突然“看到”无处不在的单元测试,显然你对集成非常明确:)

标签: dependency-injection nunit castle-windsor integration-testing


【解决方案1】:

如果您从 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() 轻松加载它。

另外,这里不需要使用 Common Service Locator。

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

【讨论】:

  • 感谢 cmets;当集成测试夹具按照您的建议加载时,我正在使用安装程序来连接我的所有依赖项。我实际上在一个单独的程序集中执行所有这些,所以集成测试真的不知道 Windsor 正在管理所有这些(因此使用公共服务定位器来检索我的依赖项的原因)。我想可能会说我对这种方法很懒惰,但我的依赖关系图非常复杂,所以这是我能想到的唯一可行的方法来消除我的集成测试夹具的大量设置工作。跨度>
  • 作为参考,我正在使用这些方面的东西来连接我的依赖项:fabiomaulo.blogspot.com/2009/11/guywire.html
【解决方案2】:

我认为你也可以用 Castle 做到这一点。 Windsor Installer 是一个通用接口,可用于初始化您的容器/注册组件。然后,您可以根据应用程序执行的上下文根据需要多次实现此接口 您可以有一个安装程序在生产环境中注入真实对象,另一个安装程序注入模拟对象/测试替身以进行集成测试。

您可以在http://docs.castleproject.org/Windsor.Installers.ashx找到更多信息

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2018-01-27
    • 2015-03-21
    • 2017-06-05
    相关资源
    最近更新 更多