我正在测试一些使用StructureMap进行控制反转的代码,当我为同一个界面使用不同的具体类时,问题就出现了。
例如:
[Test]
public void Test1()
{
ObjectFactory.Inject<IFoo>(new TestFoo());
...
}
[Test]
public void Test2()
{
ObjectFactory.Initialize(
x => x.ForRequestedType<IFoo>().TheDefaultIsConcreteType<RealFoo>()
);
// ObjectFactory.Inject<IFoo>(new RealFoo()) doesn't work either.
...
}
如果Test2使用RealFoo独立运行,它的工作正常。但如果Test1首先运行,Test2最终使用TestFoo而不是RealFoo。是不是应该隔离NUnit测试?如何重置StructureMap?
奇怪的是,如果我不包含Initialize表达式,Test2将失败。但如果我确实包含它,它就会被忽略......
答案 0 :(得分:2)
如果必须在测试中使用ObjectFactory,请在SetUp或TearDown中调用ObjectFactory.ResetAll()。
更好的是,尝试根据ObjectFactory迁移代码。任何需要从容器中取出东西的类(除了启动方法)都可以接收IContainer,它将自动由StructureMap填充(假设从容器中检索类本身)。您可以通过其Container属性引用ObjectFactory包装的IContainer。您还可以完全避免使用ObjectFactory,只需创建自己管理的Container实例(可以像ObjectFactory一样配置它)。
答案 1 :(得分:0)
是的,NUnit测试应该是孤立的,你的责任是确保它们是孤立的。解决方案是在测试夹具的TearDown方法中重置ObjectFactory。例如,您可以使用ObjectFactory.EjectAllInstancesOf()。