2010-03-05 26 views
1

我剛剛一直在使用起訂量的一些測試,但遇到了麻煩想測試我想通過一個try catch塊調用兩次的方法。原則是第一次調用引發異常,然後在catch中糾正問題並再次調用該方法。測試在一個嘗試捕捉隨着起訂量相比,犀牛製品

我設法與犀牛嘲笑做如下但作爲新兩個框架我想知道如果有人能告訴我,如果同樣可以使用起訂量來實現。

// C.U.T 
public class Mockee 
{ 
    bool theCatLives = true; 

    public Mockee() { } 

    public virtual void SetFalse() 
    { 
     theCatLives = false; 
    } 
} 


[Test] 
public void TestTryCatch(){ 

    var mr = new MockRepository(); 
    var mock = mr.StrictMock<Mockee>(); 
    mr.Record(); 
    Expect.Call(mock.SetFalse).Throw(new Exception()); 
    Expect.Call(mock.SetFalse); 
    mr.ReplayAll(); 

    try 
    { 
     mock.SetFalse(); 
    } 
    catch 
    { 
     mock.SetFalse(); 
    } 

    mock.VerifyAllExpectations(); 
} 

回答

2

對於Moq來說這並不是特別容易,因爲它沒有有序期望的概念。你可以,但是,使用回調方法,並從那裏拋出異常,如:

var actions = new Queue<Action>(new Action[] 
{ 
    () => { throw new Exception(); }, 
    () => { } 
}); 

var mock = new Mock<Mockee>(); 
mock.Setup(m => m.SetFalse()).Callback(() => actions.Dequeue()()).Verifiable(); 

try 
{ 
    mock.Object.SetFalse(); 
} 
catch 
{ 
    mock.Object.SetFalse(); 
} 
mock.Verify(); 

然而,需要注意的是,這個版本只檢查是否SetFalse方法被調用。

如果你想驗證它被稱爲兩次,你可以在最後一條語句改成這樣:

mock.Verify(m => m.SetFalse(), Times.Exactly(2)); 

然而,這稍微違反了DRY原則,因爲你會說明相同設置的兩倍,但你可以通過首先聲明和定義Expression<Action<Mockee>>類型的變量並將其用於SetupVerify方法中的變量來解決該問題...

+0

謝謝,我還沒有玩過CallBack(),但看起來很有趣! – Grokodile 2010-03-05 19:40:18