2009-08-13 3 views
1

StructureMap에 의존하는 일부 단위 테스트를 작성하므로 내 [SetUp] 메서드에서 ObjectFactory를 완전히 재설정하고 싶습니다. 이것은 내 [설정] 방법은 지금 모습입니다 :StructMap의 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()의 효율성을 무효화했습니다. 이 두 줄의 코드를 전환하면 작동합니다.

이 작동하지 않습니다

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