2011-01-23 52 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方法接收到一個對象?這個測試是否增加了價值?這是值得的時間來寫它?

如果我在此場景中添加曲線,即我的控制器上的SaveObject方法重定向到另一個操作,我將如何測試重定向?

回答

2

沒有。

在這種情況下,您正在測試您是否正確編寫了測試。

如果您使用任何類型的RDBMS,通常使用內存中的存儲庫進行測試通常是不好的,因爲除非您複製所有數據和關係約束,否則很容易針對在生產中不會發生的情況編寫測試。

現在這是有爭議的,但這種類型的測試幾乎是無用的,因爲它可能你的應用程序甚至不運行沒有這個邏輯工作。如果這段邏輯失敗,所有的集成測試也將失敗。這對我來說足夠了。

+0

你對關於使用內存版本的RDBMS的評論確實引起了共鳴。我已經被這幾次燒了 - 最令人驚訝的是,如果你說r.Name == nameVar其中nameVar爲null,你會得到一個無用的T-SQL WHERE Name的查詢,那麼LINQ/EF不會在查詢中正確處理null = @whatever與@whatever爲空,而不是IS NULL查詢。測試運行良好,但不在現實世界中 – 2011-01-23 17:52:08

1

它看起來像這個測試測試的唯一事情是你的模擬框架設置正確。我會說在這樣的測試中價值很小。爲了試着回答你的第二個問題,如果你的SaveObject方法重定向到另一個動作,比如說X,我想你會想測試一下其他一些模擬上的一些公共動作是由X執行的。很難做到更多具體沒有更多的細節。

1

如果你想測試你的倉庫,你不應該嘲笑它。相反,嘲笑它的依賴關係。

用於測試重定向嘗試mvccontrib測試助手。有了它你可以做這樣的事情:

 [Test] 
     public void RedirectToIndex() 
     { 
      SomeController controller = new SomeController(); 
      ActionResult result = controller.Index(); 
      result.AssertActionRedirect().ToAction("Index"); 
     }