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() の有効性を無効にしました。この 2 行のコードを切り替えると、機能します。

これは動作しません:

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

これは機能します:

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