2009-08-13 3 views
1

私は[SetUp]メソッドでObjectFactoryを完全にリセットしたいので、StructureMapに依存する単体テストをいくつか書いています。私の[設定]の方法は、今のように見えるものです:StructureMapのObjectFactoryをリセットする

[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; 
     } 
    } 
} 

答えて

1

私はそれを理解しました。 ObjectFactory.EjectAllInstancesOf()は実際にはTの設定があることに依存しています。私のコードでは、まずすべての設定をクリアしてObjectFactory.EjectAllInstancesOf()の有効性を無効にしました。これらの2行のコードを切り替えると動作します。

これは動作しません:

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

ない正確にあなたがのObjectFactoryが、のStructureMapコンテナに依存しないように、あなたのテストをwrintingを考慮に入れていたが答えは?

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

この場合、コンテナを再作成するだけで、元の状態にする必要があります。

+0

私は私が代わりにコンテナを使用するために、上記の投稿のテストを修正し、それはまだ失敗:

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

これは動作しません。 –

+0

コンテナを再作成するのはかなり遅いです... – Andrew

関連する問題