2011-01-03 3 views
0

Ich würde gerne wissen, wie Sie mit so etwas umgehen. Was ist die beste Praxis ..RhinoMock - Mehrere Erwartungen in einer Methode - Best Practice

Lest sagen, dass ich eine Methode namens Last auf einem Moderator Objekt haben

zunächst sieht das Verfahren wie folgt aus:

public void Load(ViewMode mode, int? id) 
{ 
    if(mode == ViewMode.Modify) 
      view.CurrentEntity = model.GetMyEntityById(id.GetValueOrDefault(0)); 
    else 
      view.CurrentEntity = model.CreateNewEntity(); 
} 

diesen Code zu testen Ich habe 2 Tests mit RhinoMock Setup Erwartungen

[TestMethod] 
public void Load_ShouldCallModelToGetEntityIfViewModeEqualsModify() 
{ 
    IView view = _mockery.StrictMock<IView>(); 
    IModel model = _mockery.StrictMock<IModel>(); 

    Entity e = new Entity() 

    using(_mockery.Ordered()) 
    { 
      Expec.Call(model.GetMyEntityById(3)).Return(e) 
      view.CurrentEntity = e; 
    } 
    _mockery.ReplayAll() 

    Presenter sut = new Presenter(view, model); 

    sut.Load(ViewMode.Modify, 3); 

    _mockery.VerifyAll(); 
} 

Und ich habe ich dann einen anderen Test, der den anderen Weg für die ViewMode.Add testen ...

So ist meine Frage, ob ich die Load-Methode auf den Vortragenden zu aussehen wie

public void Load(ViewMode mode, int? id) 
{ 

    view.CollectionA = model.GetListOfA(); <------ADDED THIS 
    view.CollectionB = model.GetListOfB(); <------AND THIS 

    if(mode == ViewMode.Modify) 
      view.CurrentEntity = model.GetMyEntityById(id.GetValueOrDefault(0)); 
    else 
      view.CurrentEntity = model.CreateNewEntity(); 
} 

jetzt geändert Ich habe die Erwartung für beide GetList Methoden in allen meinen vorherigen Test hinzuzufügen, oder es wird in 0 Actual Erwartete Ergebnisse 1. Auch ich werde meinen Testnamen ändern müssen, weil ich im Test weit mehr erwarte, als nur das Modell anzurufen, um eine Entity durch seine ID zu erhalten.

Also gibt es eine beste Praxis dafür. Ist das Ändern all meiner Tests der richtige Weg, Dinge zu tun, wenn ich Aufrufe zu einigen Mocks hinzufüge, oder es gibt eine Möglichkeit, nur einige Aufrufe für vorherige Tests zu erwarten und einen weiteren Test hinzuzufügen, der etwa so aussehen würde: [TestMethod] public void Load_ShouldCallModelToObtainAListOfA();

und es würde nicht meine anderen Tests zum Scheitern bringen.

Ich weiß, es ist eine vage Frage, aber wenn jemand versteht, was ich bitte, sag mir bitte, wie du mit Verhaltenstests mit dieser Art von Situation umgehst.

Vielen Dank Breach

Antwort

1

Es sieht aus wie Sie Ihre Unit-Tests sind schriftlich, dass bestimmte Methoden zu machen sind, um die gewünschten Ergebnisse zu erzielen genannt. Tu das nicht. Es macht Ihre Tests sehr spröde und erschwert das Refactoring.

Stattdessen testen gerade die Verhalten Ihrer Load-Methode, nicht, wie das Verhalten implementiert ist. Wenn Sie Ihre Load-Methode betrachten, werden einige Sammlungen aufgefüllt und die CurrentEntity-Eigenschaft festgelegt. Daher sollte Ihr Test einfach sicherstellen, dass nach dem Aufruf der Load-Methode die Collections gesetzt werden und CurrentEntity auf den erwarteten Wert gesetzt wird.

Stub das Modell aus, um einige vordefinierte Antworten für die verschiedenen Methoden zurückzugeben, die für das Modellobjekt aufgerufen wurden, und führen Sie dann den Test aus. Stellen Sie sicher, dass die vordefinierten Werte in Ihrer Ansicht angezeigt werden.

+0

Vielen Dank für Ihre Antwort. Es hat meine Frage perfekt beantwortet – Breach