2014-01-07 22 views
0

我有一個方法,下面類,我想用起訂量來測試:起訂量:驗證是否空洞被稱爲沒有實際執行其代碼

public class TestClass: ITestClass 
{ 
     // ... 
    public void ProcessAutomaticFillRequest(FillRequestParamDataContract fillRequestParam) 
    { 
     //... 

     NotificationServer.Instance.Publish(channel, fillRequestParam); 
    } 

在我的測試中,我有以下幾點:

[TestMethod] 
    public void CanFillRequest() 
    { 
     // ... 

     _notificationServer.Setup(ns => ns.Publish(It.IsAny<string>(), It.IsAny<FillRequestParamDataContract>())).Verifiable(); 
     _TestClass.ProcessAutomaticFillRequest(fillRequestParam); 
     _notificationServer.Verify(ns => ns.Publish(It.IsAny<string>(), It.IsAny<FillRequestParamDataContract>()), Times.Once); 
    } 

問題是我想測試Publish是否被調用,但實際上沒有在Publish方法中運行代碼,因爲它有太多依賴,我無法模擬。我認爲把Verifiable()會做到這一點,但我得到了依賴關係拋出的異常。我想要做的就是測試發佈的調用是否完成,但是在測試期間沒有運行它的代碼。

回答

0

您必須通過NotificationServer實例才能調用模擬方法,否則將調用NotificationServer.Instance返回的實例的方法。像下面的東西應該工作。如果有意義的話,你也可以在構造函數中傳遞實例。

[TestMethod] 
public void CanFillRequest() 
{ 
    var _notificationServer = new Mock<NotificationServer>(); 
    _TestClass.ProcessAutomaticFillRequest(fillRequestParam, _notificationServer.Object); 

// Below change "string" to whatever the type for channel is. 
    _notificationServer.Verify(ns => ns.Publish(It.IsAny<string>(), It.IsAny<FillRequestParamDataContract>()), Times.Once); 
} 

public class TestClass : ITestClass 
{ 
    // ... 
    public void ProcessAutomaticFillRequest(FillRequestParamDataContract fillRequestParam, NotificationServer _notificationServer) 
    { 
     //... 

     _notificationServer.Publish(channel, fillRequestParam); 
    } 
} 
+0

我不明白,爲什麼我必須將方法ProcessAutomaticFillRequest添加到測試類?這是我正在測試的方法(「Act」是AAA的一部分)。而且只有一個參數FillRequestParamDataContract。無論如何,你的代碼幫助我提前一點,因爲現在我得到一個錯誤,說當我期望它被調用一次時,該方法被調用了0次。這很奇怪,因爲當我調試測試時,斷點顯然會到達執行發佈的那一行。但測試告訴我它被調用了0次。有沒有我沒有看到的東西? – Ray

+0

我無法測試,因爲沒有使用所有類。我剛剛在答案中更新了測試。只要確保將字符串更改爲任何類型的通道。 –