我目前正在使用Castle Windsor版本2.1作为我的容器,并希望使用在其中注册的服务执行集成测试。
目前,我使用Common Service Locator来检索我的服务实例并对其执行集成测试:
var myService = ServiceLocator.Current.GetInstance<IMyService>();
// do stuff with myService
我理想的做法是将我的服务依赖项自动注入我的NUnit测试夹具。 Spring似乎提供了this functionality,但我无法使用Castle找到类似的东西。
有人能指出我正确的方向吗?
修改
我确信每个人都有(有效)点,这是否是好的想法;让我们假设它就是在这种情况下...有人能告诉我这个如何使用Windsor完成?
答案 0 :(得分:5)
如果你从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,它会自动模拟服务(当然,除非你用具体的覆盖它们)。
答案 1 :(得分:0)
我认为你也可以用Castle做到这一点。 Windsor Installer是一个通用接口,可用于初始化容器/寄存器组件。然后,您可以根据需要多次实现此接口,具体取决于应用程序执行的上下文 您可以拥有一个在生产环境中注入实际对象的安装程序和另一个为集成测试注入模拟对象/测试双精度的安装程序。
找到更多信息