2011-01-23 12 views
1

私は単純なasp.net mvc 3アプリのテストを書いているので、私は過去に盲目的に書いたテストについて何か気づいた。このテストは本当に価値を追加しますか?

[TestMethod] 
public void Add_Saves_Object() 
{ 
    var rep = new Mock<IRepository>(); 
    rep.Setup(x => x.Save<Object>(It.IsAny<Object>())).Returns(new Object() {Id = 1}); 

    var pick = rep.Object.Save<Pick>(new Object()); 

    Assert.IsNotNull(pick); 
    Assert.AreEqual(1, pick.Id); 
} 

ここでの仮定は、私は「インメモリ」は、データストアに対する私のIRepository実装をテストしてみたということで、(私は私のリポジトリをからかっていたよう)Saveメソッドは正しくオブジェクトを返します。私のリポジトリ・テストが正常に終了したので、コントローラがリポジトリを正しく呼び出し、saveメソッドから戻ってオブジェクトを受け取ることをテストする必要がありますか?このテストは価値を追加しますか?それを書いておく価値がありますか?

このシナリオにカーブを追加すると、コントローラのSaveObjectメソッドが別のアクションにリダイレクトされます。どのようにリダイレクトをテストしますか?

答えて

2

いいえ。

このシナリオでは、テストを正しく作成したことをテストしています。

すべてのデータ制約とリレーションシップ制約をレプリケートしない限り、実稼働環境では起こり得ないシナリオに対するテストを非常に簡単に書くことができないため、RDBMSのタイプを使用している場合、通常はメモリ内のリポジトリをテストするのは悪いです。

これは論争ですが、このタイプのテストは、このロジックが機能しなくても実行されない可能性があるため、ほとんど役に立ちません。このロジックが失敗すると、すべての統合テストも失敗します。それは私のために十分です。

+0

RDBMSのメモリ内バージョンの使用についてのあなたのコメントは、実際には和音を鳴らします。私はそれを数回焼き付けました - 最も顕著なのは、r.Name == nameVar、nameVarがnullの場合、LINQ/EFがクエリで正しくNULLを処理しないことです。WHERE Nameの無駄なT-SQLクエリを取得しますIS NULLクエリではなく、@whateverがnullの@whatever。テストは正常に実行されますが、現実の世界では実行されません –

1

このテストでテストされているのは、モックフレームワークが正しく設定されていることだけです。私はそのようなテストでは最小限の価値があると言います。

SaveObjectメソッドが別のアクション、たとえばXにリダイレクトする場合、2番目の質問に答えるには、他のモックの公開アクションがXによって実行されたことをテストしたいと思います。詳細な説明はありません。

1

リポジトリをテストする場合は、そのリポジトリをモックしないでください。代わりに、その依存関係を模倣する。

テスト用リダイレクトtryout mvccontribテストヘルパ。これで、次のようなことができます:

 [Test] 
     public void RedirectToIndex() 
     { 
      SomeController controller = new SomeController(); 
      ActionResult result = controller.Index(); 
      result.AssertActionRedirect().ToAction("Index"); 
     } 
関連する問題