在NUnit测试之间不重置StructureMap

时间:2009-12-16 16:21:47

标签: nunit structuremap

我正在测试一些使用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将失败。但如果我确实包含它,它就会被忽略......

2 个答案:

答案 0 :(得分:2)

如果必须在测试中使用ObjectFactory,请在SetUp或TearDown中调用ObjectFactory.ResetAll()。

更好的是,尝试根据ObjectFactory迁移代码。任何需要从容器中取出东西的类(除了启动方法)都可以接收IContainer,它将自动由StructureMap填充(假设从容器中检索类本身)。您可以通过其Container属性引用ObjectFactory包装的IContainer。您还可以完全避免使用ObjectFactory,只需创建自己管理的Container实例(可以像ObjectFactory一样配置它)。

答案 1 :(得分:0)

是的,NUnit测试应该是孤立的,你的责任是确保它们是孤立的。解决方案是在测试夹具的TearDown方法中重置ObjectFactory。例如,您可以使用ObjectFactory.EjectAllInstancesOf()。