2009-08-13 10 views
1

Ich schreibe einige Komponententests, die auf StructureMap basieren, also möchte ich die ObjectFactory in meiner [SetUp] -Methode vollständig zurücksetzen. Dies ist, was meine [SetUp] Verfahren wie jetzt aussehen:Reset ObjectFactory in StructureMap

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

Dies scheint die Konfiguration zurückgesetzt, weil ich die ObjectFactory.WhatDoIHave() -Methode ausführen kann und es nicht jede meiner Konfiguration enthält. Objekte im Cache werden jedoch nicht entfernt und in nachfolgenden Tests zurückgegeben. Gibt es eine Möglichkeit, komplett die ObjectFactory zurücksetzen?

Ich dachte, ich müsste möglicherweise ObjectFactory.EjectAllInstancesOf() verwenden, aber das scheint nicht zu helfen.

Ich benutze Version 2.5.3.

Hier ist ein erfundener Code, um zu zeigen, worüber ich rede. Ich würde erwarten, dass dieser Test bestanden wird, aber das tut es nicht.

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

Antwort

1

Ich habe es herausgefunden. ObjectFactory.EjectAllInstancesOf() ist tatsächlich davon abhängig, dass es eine Konfiguration für T gibt. In meinem Code habe ich die Effektivität von ObjectFactory.EjectAllInstancesOf() zunichte gemacht, indem ich zuerst die gesamte Konfiguration gelöscht habe. Wenn ich diese zwei Codezeilen umschalte, funktioniert es.

funktioniert das nicht:

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

Das funktioniert:

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

Nicht gerade eine Antwort, aber haben Sie darüber nachgedacht, Ihren Test wrinting, so dass Sie nicht auf dem Object verlassen Sie sich aber die StructureMap Container?

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

In diesem Fall können Sie einfach den Container neu erstellen und meine Vermutung ist, dass es in einwandfreiem Zustand sein sollte.

+0

ich den Test, den ich über den Behälter zu verwenden, anstatt geschrieben geändert und es immer noch nicht. –

+0

Das Erstellen des Containers ist ziemlich langsam aber langsam ... – Andrew