2010-12-14 2 views
1

特定のパラメータがメソッドのFINAL呼び出しで渡されるかどうかをテストするには、Rhino Mocksでどのような方法が最適ですか?たとえば、mockview.SetSomething(myObj)はmockview.Initによって何回も呼び出されるかもしれませんが、最後にmockview.SetSomething(inParticular)として呼び出されたことをテストしたいと思います。RhinoMockを使用して「最終通話で渡されたパラメータ」をテストするにはどうすればよいですか?

これでGetArgumentsForCallsMadeOnを使用できることが分かりましたが、後でパラメータ保持変数を変更した場合に問題が発生します。例えば

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"); 

    } 
} 

その後、私のテストがある...

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

私が欲しいのはSetSomethingへの最後の呼び出しは、{名前= "二"、年齢= 2}としたことを確認することです。今workingPresenterはこれを行いますが、notWorkingPresenterもそうするとは思いませんか?

答えて

1

コード内に何か他のものがなければなりません(嘲笑の外)。私は一緒にいくつかの項目投げた:

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

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

をそして私はそれをテスト:

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

そして、私は2の値とViewDataを内部に「二」を得ました。 Rhino.Mocksは、あなたがしたいことをサポートしているようです。元の質問で特定された問題(最新の情報への参照がある場所)を示す失敗したテストケースを作成できますか?

+0

こんにちはPatrick.Yes申し訳ありません:コードを簡略化しようとして、私は問題を単純化しました!以下は、私が問題と思うものを示しています。公平になるために、コードを書く上でより良い方法が見えますが、私はまだ直感的にNotWorkingPresenterが動作することを期待していますか? –

関連する問題