2017-08-22 48 views
0

我有一個模擬對象,其方法我試圖通過拋出一個異常時執行,爲一個特定的單元測試用例使用Moq框架。VerifyAll()與拋出<T>()在Moq

var mockMySvc = new Mock<IMySvc>(); 

mockMySvc 
    .Setup(x=>x.SomeMethod()) 
    .Throws<Exception>(); 

//Execution of some code 

//At the assertions 
mockMySvc.VerifyAll(); 

在運行時,該代碼抱怨沒有得到滿足的mockMySvc所有的expections儘管被拋出的異常。我是否錯過了某些東西,或者.VerifyAll()方法不適用於.Throws()功能。

回答

1

我不知道你的設置它的方式,但我總是這樣說:

Assert.Throws<Exception>(() => myclass.SomeMethod()); 

這樣你就不需要驗證什麼。


基於您的評論,這是你如何確保拋出異常的方法中,這樣就可以檢查裏面catch塊代碼。

[Test] 
public void Test1() 
{ 
    _filmService.Setup(f => f.FindById(It.IsAny<int>())).Throws<Exception>(); 
    _filmController.Test(); 
    _filmService.Verify(f => f.Exists(It.IsAny<Film>()), Times.Once); 
} 

實際代碼:

public ActionResult Test() 
{ 
    try 
    { 
     _filmService.FindById(-1); 
    } 
    catch (System.Exception) 
    { 
     _filmService.Exists(null); 
    } 
    return View(); 
} 

這只是我在我的代碼測試的例子,它工作正常。

+0

在'someMethod()'的範圍內,我有一個try catch塊。該嘗試需要拋出一個異常的catch塊,這就是我通過設置/拋出我的代碼實現。我的代碼不會返回異常。你所聲稱的是假設該方法會拋出異常。 –

+1

我現在明白了。你真的執行'SomeMethod'方法嗎?看看這裏:http://www.syntaxsuccess.com/viewarticle/mock-exceptions-using-moq – FCin

+0

是的,這就是我想要做的 - 模擬一個異常。我想我不應該驗證通過VerifyAll()拋出的異常,而是驗證是否記錄了正確的異常。謝謝!這有助於理解我在邏輯上做錯了什麼。 –