2009-07-22 11 views
1

Pro ASP.NET MVC Frameworkの最初の7つの章を読んだ後、非常にお勧めします。私の読書を通して、著者 - Steve Sandersonは、いくつかのTDDプラクティスに多く触れられました。今、私の質問は:
スティーブは、コントローラ自身、本書の例に対する彼のユニットテストを実行するために使用:
テストコントローラまたはBusinessModel?

[Test] 
    public void List_Includes_All_Products_When_Category_IsNull() { 
     //Arrange: 
     IProductsRepository repository = MockProductsRepository(
      new Product { Name = "First Product", Category= "Cat11"}, 
      new Product { Name = "SecondProduct", Category = "Cat22" } 
     ); 
     ProductsController controller = new ProductsController(repository); 
     controller.PageSize = 10; 

     //Act: 
     var result = controller.List(null, 1); 

     //Assert: 
     Assert.IsNotNull(result, "Didn't render view!"); 
     var model = controller.ViewData.Model as IList<Product>; 
     Assert.AreEqual(2, model.Count, "Got wrong number of products!"); 
     Assert.AreEqual(model[0].Name, "First Product", "Not the expected first item."); 
     Assert.AreEqual(model[1].Name, "SecondProduct", "Not the expected second item.");   
    } 

スティーブはこれをテストしている理由を私は理解して、明らかに彼はに対して彼のロジックをチェックする必要があります彼が設定したViewDataフラグは、リストコントローラーのアクションを呼び出す必要があるのですが、私の質問はそれで十分ですか?つまり、最初にモデルオブジェクトをテストしてはいけませんか?スティーブはORMツールとしてLINQ2SQLを使用していますが、LINQ機能の外では何も使用していません。データとLINQの組み込みメソッドを呼び出すだけでデータを選択したり更新することができます。ビジネス検証はありません。私の実際のアプリケーションでは、多くのビジネス検証が必要です。コントローラーレベルでのテストを開始するには十分な(または簡単な)ことでしょう。私はModelクラスを無視しています(なぜなら、良いアイデア)?
あなたのアイデアを待っています!

答えて

1

コントローラテストに加えて、ビジネスロジックのテストを別にしたいと思うでしょう。

私はSteveのようにコントローラテストを手配しています。基本的に、条件が与えられた場合、コントローラには期待されるビューデータが含まれていますか?それでおしまい。別のテストに含まれているデータやその他のビジネスロジックの内部の詳細については何も言及していません。

あなたの例に続いて、私はあなたのコントローラのテストでそれを維持し、あなたが否定的な価格を防ぐいくつかのビジネスロジックを持っていたと言うことができますしたい、あなたはから切り離されている「Product_discount_does_not_result_in_negative_price()」のようなもののために別のテストを持っているかもしれませんウェブコンテキストとコントローラ。あなたはそれがいくつかのいわゆる割引は、実際のデフォルトの価格よりも実際には多くの場合でも、$ 1の価格の最小だなりのルールを持っているあなたのプロダクトクラス内で言ってみましょう:(恐ろしいたとえば、申し訳ありません!)

[Test] 
Product_discount_does_not_result_in_negative_price() { 
    Product p = new Product {price = 5, discount = 10}; 
    Assert.IsTrue(p.price == 1); //expecting the price Get() to return 1 in this case 
} 

に私は思いますコントローラーレベルでテストを続けていた場合は、テストを作成して実装する必要があります。

+0

これは私がやったことです。 Kurtに感謝します。受け入れられる! – Galilyou

関連する問題