2010-12-14 9 views
1

Was ist der beste Weg in Rhino Mocks zu testen, dass ein bestimmter Parameter beim Aufruf von FINAL an eine Methode übergeben wird? ZB mockview.SetSomething (myObj) kann beliebig oft von mockview.Init aufgerufen werden, aber ich möchte es beim letzten Aufruf als mockview.SetSomething (inParticular) testen.Wie kann ich mit "RhinoMocks" die "Parameter im letzten Anruf" testen?

Jetzt weiß ich, ich kann GetArgumentsForCallsMadeOn mit diesem verwenden, aber mein Problem ist, dass es nicht funktioniert, wenn ich die Parameterhaltevariable nachträglich geändert habe. z

public interface IView 
{ 
    void SetSomething(ViewData data); 
} 

public class ViewData 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 

    public ViewData Person(int age, string name) 
    { 
     Age = age; 
     Name = name; 
     return (this); 
    } 
} 

public class WorkingPresenter 
{ 
    public void Init(IView view) 
    { 
     var data = new ViewData {Age = 1, Name = "One"}; 
     view.SetSomething(data); 
     data = new ViewData {Age = 2, Name = "Two"}; 
     view.SetSomething(data); 
     data = new ViewData {Age = 3, Name = "Three"}; 
    } 
} 

public class NotWorkingPresenter 
{ 
    private ViewData _data; 

    public void Init(IView view) 
    { 
     _data = new ViewData(); 
     view.SetSomething(_data.Person(1, "One")); 
     view.SetSomething(_data.Person(2, "Two")); 
     _data.Person(3, "Three"); 

    } 
} 

dann meine Tests sind ...

[Test] 
    public void GetDataOfLastCall() 
    { 
     ViewData dummydata=null; 
     var view = MockRepository.GenerateStub<IView>(); 

     //Approach 1 : This works 
     var workingPresenter = new WorkingPresenter(); 
     workingPresenter.Init(view); 
     var lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata)).Count - 1; 
     var lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata))[lastCall]; 
     var lastData = (ViewData)lastParams[0]; 

     //Approach 2: This doesn't 
     var notWorkingPresenter = new NotWorkingPresenter(); 
     notWorkingPresenter.Init(view); 
     lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata)).Count - 1; 
     lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(dummydata))[lastCall]; 
     lastData = (ViewData)lastParams[0]; 

Was ich will SetSomething, dass der letzte Anruf war mit zu überprüfen ist, {name = "Two", age = 2}. Arbeitet Presenter dies, aber würden Sie nicht auch WorkingPresenter erwarten?

Antwort

1

Es muss etwas anderes in Ihrem Code passieren (außerhalb des Spotts). Ich warf nur zusammen ein paar Punkte:

public interface IView 
{ 
    void SetSomething(ViewData data); 
} 

public class ViewData 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

Und Getestet habe ich es mit:

[TestMethod] 
public void GetDataOfLastCall() 
{ 
    var view = MockRepository.GenerateStub<IView>(); 

    var data = new ViewData {Age = 1, Name = "One"}; 
    view.SetSomething(data); 
    data = new ViewData { Age = 2, Name = "Two" }; 
    view.SetSomething(data); 
    data = new ViewData { Age = 3, Name = "Three" }; 

    var lastCall = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(data)).Count - 1; 
    var lastParams = view.GetArgumentsForCallsMadeOn(v => v.SetSomething(data))[lastCall]; 
    var lastData = (ViewData) lastParams[0]; 
} 

Und ich habe die Werte von 2 und „Zwei“ in dem Bildschirmtextsystem. Es scheint, dass Rhino.Mocks unterstützt, was Sie tun möchten. Können Sie einen fehlerhaften Testfall erstellen, der das in Ihrer ursprünglichen Frage angegebene Problem anzeigt (wo Sie einen Verweis auf die neuesten Informationen erhalten haben)?

+0

Hallo Patrick.Ja Entschuldigung: in dem Versuch, den Code zu vereinfachen, habe ich das Problem vereinfacht! Das Folgende zeigt, was ich denke, das Problem ist. Um fair zu sein, sehe ich jetzt bessere Möglichkeiten, den Code zu schreiben, aber ich würde trotzdem intuitiv erwarten, dass NotWorkingPresenter funktioniert. –