2011-01-03 12 views
0

私はあなたのような何かをどうやって処理するのか知りたいと思います。ベストプラクティスは...RhinoMock - 1つの方法で複数の期待 - ベストプラクティス

ないように私がプレゼンターオブジェクト

の負荷というメソッドを持っていると言ういただきました第一の方法は、次のようになります。

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

このコードをテストするために私が使用して2つのテストを持っていますRhinoMockセットアップ期待に

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

そして私は、私はViewMode.Addために他のパスをテストする別のテストを持っている...

だから私は

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(); 
} 

のようなルックスにプレゼンターのLoadメソッドを変更した場合、私の質問は今、私はすべての私の前のテストで両方GetListの方法の期待を追加する必要がありますされたり、それは期待0実際になりますテストでは、モデルを呼び出すだけでなく、IDでエンティティを取得するよりも、テストの名前を変更する必要があります。

そのためには最高の方法があります。私のすべてのテストを変更することは、いくつかのモックにコールを追加するときの正しい方法です。以前のテストの呼び出しをいくつか期待し、次のような別のテストを追加する方法があります。 [TestMethod] public void Load_ShouldCallModelToObtainAListOfA();

となり、他のテストが失敗することはありません。

私はその漠然とした疑問を知っていますが、誰かが私に尋ねることを理解している場合は、このような状況を行動テストでどのように処理するか教えてください。

はどうもありがとうございました 違反あなたが望む結果を達成するために呼ばれていることを確認特定のメソッドを作るためにあなたのユニットテストを書いているように見えます

答えて

1

。これをしないでください。テストが非常に脆くなり、リファクタリングが困難になります。

代わりに、ちょうどその行動はの実装がどのようにあなたのLoadメソッドの行動をテストし、ではありません。あなたのLoadメソッドを見てみると、いくつかのコレクションに値を設定し、CurrentEntityプロパティを設定しています。したがって、Loadメソッドが呼び出された後、コレクションが設定され、CurrentEntityが予期したものに設定されていることをテストで確認する必要があります。

モデルをスタブして、モデルオブジェクトで呼び出されたさまざまなメソッドに対するいくつかの缶詰応答を返し、テストを実行します。表示された値が表示されていることを確認します。

+0

ありがとうございました。それは私の質問に完全に答えました – Breach

関連する問題