2013-05-22 32 views
9

考慮以下內容,其中我測試的是注入依賴的方法被稱爲指定的次數實際方法調用次數:當使用起訂量驗證()方法調用次數,已經失敗的測試的出錯信息包含了使用起訂量

[Fact] 
public void WhenBossTalksEmployeeBlinksTwice() 
{ 
    // arrange 
    var employee = new Mock<IEmployee>(); 
    employee.Setup(e => e.Blink()); 

    var boss = new Boss(employee.Object); 

    // act 
    boss.Talk(); 

    // assert 
    employee.Verify(e => e.Blink(), Times.Exactly(2)); // Passes as expected 
    employee.Verify(e => e.Blink(), Times.Exactly(1)); // Fails as expected 
} 

當我強制失敗測試,​​所述輸出爲:

Moq.MockException:調用沒有在仿1次進行:電子 => e.Blink()

什麼是更好的是一樣的東西:

Moq.MockException:調用意外進行2次,沒有1次:電子 => e.Blink()

這裏有參與測試的項目:

public interface IEmployee { void Blink(); } 

public class Boss { 
    private readonly IEmployee _employee; 
    public Boss(IEmployee employee) { _employee = employee; } 

    public void Talk() { 
     _employee.Blink(); 
     _employee.Blink(); 
    } 
} 

是否有可能收穫和顯示的實際次數依賴在失敗的測試錯誤消息中調用了方法?

我不確定它的問題,但我使用Moq v3.1.416.3(不是最新的,我知道,但我正在使用的另一個庫尚未更新到Moq 4.x ...)

+1

+1的設置爲示例代碼:) – ljubomir

+3

因爲我發現這個在我的google搜索,我想我會提供更新。在Moq v4.1中(也許在所有4.x版本中),你會得到類似的結果:「預期的模擬調用一次,但是是0次」。所以這個問題的答案現在是開箱即用的。 –

回答

12

我不知道在Moq3中收集信息的直接方式。 我會做的是使用一個回調關於眨眼

int count = 0; 
    employee.Setup(e => e.Blink()).Callback(() => count++); 

    ... 
    employee.Verify(e => e.Blink(), Times.Exactly(1), "Moq.MockException: Invocation was unexpectedly performed " + count + " times, not 1 time: e => e.Blink()"); // Fails as expected 
+3

好主意!當你親自使用Moq 4.x時,你有什麼不同嗎? – Jeff