1

我正在编写一些依赖于 StructureMap 的单元测试,所以我想在我的 [SetUp] 方法中完全重置 ObjectFactory。这就是我的 [SetUp] 方法现在的样子:

[SetUp]
public void SetUp()
{
    ObjectFactory.Initialize(initializationExpression => {});
}

这似乎重置了配置,因为我可以执行 ObjectFactory.WhatDoIHave() 方法并且它不包含我的任何配置。但是,缓存的对象实例不会被删除,而是在后续测试中返回。有没有办法完全重置 ObjectFactory?

我想我可能不得不使用 ObjectFactory.EjectAllInstancesOf(),但这似乎没有帮助。

我使用的是 2.5.3 版。

这是一些人为的代码来显示我在说什么。我希望这个测试能够通过,但事实并非如此。

[TestFixture]
public class TestingStructureMap
{
    [Test]
    public void FirstTestUsingCachedObjects()
    {
        ObjectFactory.Configure(configure =>
            configure.ForRequestedType<ISomeInterface>()
                .TheDefaultIsConcreteType<SomeImplementation>()
                .CacheBy(InstanceScope.ThreadLocal)
            );

        ISomeInterface firstSomeInterface = ObjectFactory.GetInstance<ISomeInterface>();
        Assert.AreEqual(1, firstSomeInterface.ID);

        ObjectFactory.Initialize(initializationExpression => { });
        ObjectFactory.EjectAllInstancesOf<ISomeInterface>();

        ObjectFactory.Configure(configure =>
            configure.ForRequestedType<ISomeInterface>()
                .TheDefaultIsConcreteType<SomeImplementation>()
                .CacheBy(InstanceScope.ThreadLocal)
            );

        ISomeInterface secondSomeInterface = ObjectFactory.GetInstance<ISomeInterface>();
        Assert.AreEqual(2, secondSomeInterface.ID);
    }

    public interface ISomeInterface
    {
        int ID { get; }
    }

    public class SomeImplementation : ISomeInterface
    {
        private static int NumberOfInstancesCreated;
        private readonly int id;

        public int ID
        {
            get { return id; }
        }

        public SomeImplementation()
        {
            id = ++NumberOfInstancesCreated;
        }
    }
}
4

2 回答 2

1

不完全是一个答案,但您是否考虑编写测试以便您不依赖 ObjectFactory 而依赖 StructureMap 容器?

var c = new StructureMap.Container(ce=>
       {
          ce.ForRequestedType<IFoo>().TheDefaultIsConcreteType<Bar>();
       });

在这种情况下,您可以简单地重新创建容器,我的猜测是它应该处于原始状态。

于 2009-08-13T21:21:04.900 回答
1

我已经想通了。ObjectFactory.EjectAllInstancesOf() 实际上依赖于 T 的配置。在我的代码中,我通过首先清除所有配置来取消 ObjectFactory.EjectAllInstancesOf() 的有效性。如果我切换这两行代码,它就可以工作。

这不起作用:

ObjectFactory.Initialize(initializationExpression => { });
ObjectFactory.EjectAllInstancesOf<ISomeInterface>();

这确实有效:

ObjectFactory.EjectAllInstancesOf<ISomeInterface>();
ObjectFactory.Initialize(initializationExpression => { });   
于 2009-08-14T16:58:00.610 回答