2009-08-17 57 views
2

我正在嘗試moq,並且我對Setup()方法有疑問。我有以下的接口和類:關於使用安裝程序設置Moq行爲的問題

public interface IMyInterface 
{ 
    void Print(string name); 
} 
public class MyClass 
{ 
    private IMyInterface my; 
    public MyClass(IMyInterface my) 
    { 
     this.my = my; 
    } 

    public void Print() 
    { 
     my.Print("hello world"); 
    } 
} 

而且我已經得到了使用NUnit這個單元測試:

[Test] 
public void AnotherTest() 
{ 
    var mock = new Mock<IMyInterface>(); 
    mock.Setup(m => m.Print("hello world")).AtMostOnce(); 

    var myClass = new MyClass(mock.Object); 
    myClass.Print(); 

    mock.Verify(m => m.Print("hello world"), Times.Exactly(1)); 
} 

我已經試過這兩個註釋/取消註釋出以下行,這兩項測試分別爲成功的。這讓我懷疑在這種情況下Setup()是否必要,因爲我正在執行Verify()?

我正在使用版本3.5.716.1。

回答

2

在你的第一個例子中,你是對的,你不需要調用設置,因爲你正在驗證設置只執行一次。

但是在你的第二次單元測試中,它通過了,因爲你沒有真正驗證你的設置。

如果調用mock.VerifyAll(),則測試將失敗。

AtMostOnce()設置了它只會執行一次的期望。只有在明確驗證設置被調用一次後,測試纔會失敗。它不會因爲你多次呼叫而實際上失敗。

+0

是的,我剛剛意識到爲什麼測試通過關於第二個quetsion。 – Jeff 2009-08-17 02:39:58

+0

在我看來,手動驗證所有場景比設置行爲更明確,然後執行VerifyAll()。 – Jeff 2009-08-17 02:45:44