2011-03-21 51 views
0

我正在爲我的MVC 2控制器編寫單元測試(使用NUnit & Moq),下面是由Steven Sanderson編寫的Pro ASP.net MVC 2框架書中的例子(偉大的書籍,btw )。但是,我遇到了一些問題,我認爲這只是由於我對NUnit的理解不夠。當單元測試MVC控制器時出現衝突的結果

下面是摘錄,去掉無關的部分:

[Test] 
public void Cannot_Save_Invalid_Event() 
{ 
    ... 

    repository.Setup(x => x.SaveEvent(evt)).Callback(Assert.Fail); 

    ... 

    repository.Verify(x => x.SaveEvent(evt)); 
} 

這個測試是通過對我來說,雖然從我個人理解,這兩個報表應直接與對方發生衝突。第二個是不存在的,可是我把它放在以驗證它是通過正確的原因。

據我所知,我的倉庫已建立,如果「repository.SaveEvent(EVT)」被稱爲失敗。然而,在後來的測試中,我嘗試以驗證「repository.SaveEvent(EVT)」被調用。既然它通過了,這是不是表示它既被稱爲,也不被稱爲?也許這些陳述並不像我懷疑的那樣行事。

有人能解釋這兩種說法都不怎麼對立,以及他們如何能夠同時存在,並測試仍然通過了嗎?

回答

0

這樣做的原因行爲是,它運行「SaveEvent()」,但是,由於嘲笑庫沒有定義的動作,這是在我的控制器中拋出一個異常,這是我的控制器正在捕獲的。

所以,似乎回調只會成功執行,如果控制返回。

0

也許你的測試不會失敗,因爲它有一個catch-everything塊,它也隱藏了測試失敗所必需的assert/verify-exception。

注:以下單元測試將通過百達

[Test] 
public void HidingAssertionFailure() 
{ 
    try { 
     Assert.AreEqual(0,1); // this should fail 
    } catch (Exception ex) { 
     // this will hide the assertion failure 
    } 
} 
+0

不,沒有try/catch塊。不過謝謝你指出了這一點。這對我未來的知識可能會有所幫助。 – 2011-03-22 15:16:34