2016-08-03 109 views
0

我有以下類和測試類的書面使用起定量:驗證MOQ單元測試方法返回值

public class Mytest : testin 
{ 
    public int getId(int id) 
    { 
     int s = 2; 
     return s; 
    } 

} 

測試類:

private Mock<testin> _mock; 

[TestInitialize] 
public void Setup() 
{ 
    _mock = new Mock<testin>(); 

} 

[TestMethod] 
public void returngetId() 
{ 

    // Build up our mock object 

    _mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1) 

} 

我從函數返回和在單元測試用例中檢查值。根據我的理解,測試用例應該會失敗。但即時獲得成功的消息。我如何驗證返回值正是我期望的?如果返回的結果不是1,我想要通過測試。

回答

2

您當前的設置將跳過該方法的執行,而是「盲目地」返回1.如果希望執行該方法,則不應該嘲笑該方法。如果您刪除安裝線,您的測試用例確實會失敗。一般來說,如果你不需要執行,你只應該模擬一個方法。


澄清:

_mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1)配置您的模仿對象,這樣當你調用getId方法,而不是執行它,價值1總是被退回。所以,下面的測試將通過:

[TestMethod] 
public void returngetId_Always1() 
{ 
    // ... Build up our mock object 
    _mock.Setup(x => x.getId(It.IsAny<int>())).Returns(1); 
    Assert.AreEqual(1, _mock.Object.getId("foo")); 
    Assert.AreEqual(1, _mock.Object.getId("bar")); 
} 

爲了得到實際執行的方法來從模擬中調用,你要嘲笑類,而不是接口,具有以下配置:

[TestMethod] 
public void returngetId_CallBase() 
{ 
    var mock = new Mock<MyTest>() { CallBase = true }; 
    // add other method setups here. DO NOT setup the getId() method. 
    Assert.AreEqual(2, _mock.Object.getId("foo")); 
    Assert.AreEqual(2, _mock.Object.getId("bar")); 
} 

這將允許模擬推遲到沒有提供模擬設置的任何方法的基本實現。

+0

我真的很抱歉。我無法理解你的觀點。我已經更新了這個問題,以便如果在問題中存在任何混淆,都可以避免。我嘲笑界面而不是課堂。使用實例即時調用方法。這是不對的? –

+0

@TomCruise請檢查最新的答案。如果你仍然需要幫助,請告訴我。 –

+0

第二種方法即時獲取錯誤在Moq.dll中發生類型'System.NotSupportedException'的異常,但未在用戶代碼中處理 –