2010-12-13 13 views
0

私はNewsControllerというコントローラを持っています。このコントローラのコンストラクタはINewsServiceをパラメータとして受け取ります。サービス層と呼ばれるアクションメソッドがあるかどうかをチェックするユニットテスト

このコントローラには、GetUIllNews()というメソッドがあり、これはYUIデータテーブルにデータを取り込むために使用するJSON結果を返します。私はニュースサービスのFindAllメソッドがすべてのニュース項目を返すために呼び出されたかどうかをチェックする単体テストを作成したいと思います。どうすればいい?私が現在持っていることです:コントローラ用

public JsonResult GetAllNews() 
{ 
    var items = newsService.FindAll(); 
    var jsonResult = Json(items); 

    return jsonResult; 
} 

私のユニットテストは、次のようになります。

public NewsControllerTest() 
{ 
    newsServiceStub = MockRepository.GenerateStub<INewsService>(); 
    newsController = new NewsController(newsServiceStub); 
} 

[Test] 
public void GetAllNews_should_use_news_service() 
{ 
    // Arrange 
    List<News> newsList = new List<News>(); 
    newsServiceStub.Stub(s => s.FindAll()).Return(newsList); 

    // Act 
    var actual = newsController.GetAllNews(); 

    // Assert 
    newsServiceStub.VerifyAllExpectations(); 
} 

テストは、上記のコードを渡します。しかし、GetAllNews()を以下のように変更すると、それも渡されます。それは失敗してはいけませんか?

public JsonResult GetAllNews() 
{ 
    return null; 
} 
+0

なぜこれを有用なテストと見なしますか? – bzlm

+0

@bzim:私は初心者で、まだ学んでいます。何をテストするのか、どうしたらいいのか分からない。 –

答えて

3

あなたが離れてそれで得ることができる場合は、特定のメソッドが呼び出されたことをユニットテストしないでください。GetAllNewsは()のニュースサービスを使用している場合私は何をテストしようとしていることです。ユニットテストのポイントは、実装ではなく動作をテストすることです。 FindAllが呼び出されたことのテストは実装のテストです。これは、実装を変更しても動作が変わらない場合には壊れやすいテストにつながります。クライアントはあなたがそれらのすべてのニュースをどのように入手しても気にしません。

だから

public void GetAllNews_should_use_news_service() 

public void GetAllNews_should_get_all_the_news 

でなければなりませんし、私はあなたにそれをコーディングの詳細を残しておきます。

+0

あなたは行動という意味ですか? GetAllNews()メソッドの動作は何ですか?テストにGetAllNews_should_get_all_the_newsという名前を付けると、テストコードにはどのような内容が含まれますか?上記の答えにいくつかのサンプルコードを入力してください。 –

1

他の人も指摘しているように、特定のメソッド呼び出しのテストは、長期的には脆くなる可能性があります。

しかし、Rhino.Mocksの観点から、期待値を確認したい場合は、スタブの代わりにMockを使用する必要があります。 GenerateStubGenerateMockに、.Stub().Expect()と呼び出してください。それはあなたのテストを修正するはずです。

+0

モックとスタブの違いは何ですか?私はいつ2つを使うのですか? –

+0

スタンプは、固定応答を提供するために使用されます。モックは、期待を検証するために使用されます。 Mockを使用すると、缶入りの応答を提供できますが、スタブはメソッド呼び出しを追跡しないため、期待値の検証には使用できません。 – PatrickSteele

1

モックとスタブの違いについて興味深いのはMartin Fowlerです。モックは、動作検証のために使用されている間

http://www.martinfowler.com/articles/mocksArentStubs.html

はファウラーは、状態検証ために使用されるスタブを指摘しています。

関連する問題