2016-08-02 18 views
1

Ich verwende Rhino.Mocks und Struktur-Map, um Unit-Test meinen Code zu helfen. Ich habe mehrere Tests, die passieren, wenn sie von selbst ausgeführt werden, aber wenn sie ausgeführt werden, wenn eine Gruppe nicht besteht. Der Setup-Code für diese Komponententests lautet:Unit-Test verwendet keine korrekte Mocking-Klasse

[TestInitialize()] 
public void Setup() 
{ 
    ObjectFactory.Initialize(x => 
    { 
     x.For(IManager)().Use(Handler)(); 
    }); 
} 

In meinen Tests stub ich diese Schnittstelle aus und rufen Sie die Methode auf.

[TestMethod] 
public void AreMultiple_Test() 
{ 
    var mackIManager = MockRepository.GenerateMock<IManager>(); 
    mackIManager.Stub(u => u.GetTwoUserName(Arg<int>.Is.Anything)).Return(null); 
    ObjectFactory.Inject(typeof(IManager), mackIManager); 

    StepAdditionalActionBase actionBase = new StepAdditionalActionBase(); 
    bool areMultiple = actionBase.AreMultiple(new WorkOrder { Id = "123" }); 

    Assert.IsFalse(areMultiple); 
} 

Test Method 2

[TestMethod] 
public void AreMultiple_Test() 
{ 
    var mackIManager = MockRepository.GenerateMock<IManager>(); 
    mackIManager.Stub(u => u.GetTwoUserName(Arg<int>.Is.Anything)).Return("123"); 
    ObjectFactory.Inject(typeof(IManager), mackIManager); 

    StepAdditionalActionBase actionBase = new StepAdditionalActionBase(); 
    bool areMultiple = actionBase.AreMultiple(new WorkOrder { Id = "123" }); 

    Assert.IsTrue(areMultiple); 
} 

Dies ist Einheit den folgenden Code zu testen.

public bool AreMultiple(WorkOrder workOrder) 
{ 
    string secondUser = _handler.GetTwoUserName(_workflowManager.GetNumberForProject(workOrder.Id)); 
    if (String.IsNullOrEmpty(secondUser)) 
    { 
     return false; 
    } 

    return true; 
} 

Wenn ich sie selbst betreibe, funktionieren sie gut. Wenn ich sie zusammen laufen lasse, geht der erste und der zweite fehl. Wenn ich das zweite debugge, finde ich, dass der Rückgabewert in der Stubbed-Methode immer noch als Null zurückkommt. Wie bekomme ich das, um die neue Stubbed-Methode zu verwenden?

UPDATE.

Ich verwende StructureMap als meinen Container. Von dem, was ich gefunden habe, ist der folgende Code, was verwendet wird, um den Behälter zu entsorgen, den ich von diesem link bekommen habe. Wenn ich das addierte, scheiterte der Test noch, wenn er zusammen lief, aber pass, wenn er einzeln lief.

[TestCleanup()] 
public void TestCLeanup() 
{ 
    ObjectFactory.Container.Dispose(); 
} 
+0

Wie lösen Sie das Feld '_handler' auf? –

Antwort

1

Die Tests funktionieren eins nach dem anderen, scheitern jedoch, wenn sie alle zusammen ausgeführt werden. Das Problem sollte im gemeinsamen Teil sein, der über die Tests verteilt wird, die sie voneinander abhängig machen. In diesem speziellen Fall ist das ObjectFactory statisch nichts anderes als ein Service Locator (Anti-Pattern).

In den Tests Sie verspotten die IManager Schnittstelle und registrieren sie in der Object:

ObjectFactory.Inject(typeof(IManager), mackIManager); 

Dann wird der SUT verwendet die Object Service Locator zu lösen und nutzen die verspottete Schnittstelle (_handler Feld) :

string secondUser = _handler.GetTwoUserName(...) 

Ich vermute, der erste Test registriert die _handler und reinigen Sie es nie richtig, so dass die gleiche Instanz im zweiten Test erscheint. Sie sollten die ObjectFactory zwischen den Tests nach dem Muster Register Resolve Release zurücksetzen.

Eine andere (vorzuziehende) Option besteht darin, Ihr SUT so zu refaktorisieren, dass die IManager handler-Abhängigkeit explizit über constructor empfangen wird. Das würde sowohl SUT als auch Tests vereinfachen, indem die ObjectFactory Konfiguration auf Composition Root verschoben wird.

+0

Ok, also wie kann ich die Fabrik zurücksetzen? Das wäre die Antwort auf die Frage, nach der ich suche. – Nate

+0

Ich habe die Factory dispose-Methode nachgeschlagen und sie zu meiner Frage hinzugefügt. Selbst mit diesem Zusatz habe ich immer noch das gleiche Problem. – Nate

+0

Was ist 'x' und was ist' Handle' in der Setup-Methode? Ist einer von ihnen statisch? –