2009-07-22 112 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標誌他設置,這就是爲什麼他需要調用列表控制器操作,我的問題是,這足夠嗎?我的意思是,不應該先測試他的Model對象嗎? Steve使用LINQ2SQL作爲他的ORM工具,他幾乎沒有使用LINQ功能以外的任何東西,我的意思是這個例子只選擇數據,並通過調用LINQ內置的方法進行更新;沒有業務驗證。在我的真實應用程序中,有很多應該做的業務驗證,是否足夠(或者更容易)讓我在控制器級別開始測試,忽略了我的Model類(因爲我認爲它不是一個好主意)?
等待你的想法Gus!

回答

1

我想除了控制器測試之外,您還想爲業務邏輯單獨進行測試。

我正在安排我的控制器測試,就像史蒂夫。基本上,根據條件,我的控制器是否包含預期的查看數據?而已。沒有斷言數據或任何其他業務邏輯的內部細節 - 包含在單獨的測試中的東西。

遵循您的示例,我會將其保留在Controller測試中,並假設您有一些防止負價的業務邏輯,您可能需要單獨測試諸如「Product_discount_does_not_result_in_negative_price()」之類的東西Web上下文和控制器。讓你的產品類中說你有一個規則,使得它的價格最低A $ 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

這就是我最終要做的。謝謝庫爾特。公認! – Galilyou 2009-09-01 09:52:50