2012-08-02 66 views
0

我在單元測試中遇到了Moq的問題,我不確定哪裏出錯。 我有一個方法,在我的界面是這樣的:使用Moq的驗證方法的錯誤

void WriteToRegistryKey (String key, Object value); 

,我的單元測試這樣的:

var testRegistry = new Mock<IRegistry>(); 
testRegistry.Setup(x => x.WriteToRegistryKey(It.IsAny<string>(), It.IsAny<int>())); 

Utility testUtility = new ConfigUtil(testRegistry.Object); 

testUtility.UpdateRegistry(); 

testRegistry.Verify(x => x.WriteToRegistryKey("MaxNumLogFiles", 10)); 

下當我打電話testUtility.UpdateRegistry(引擎蓋)它叫我WriteToRegistryKey我想測試WriteToRegistryKey 傳遞正確值的方法。

但是我收到此當我運行測試:

Moq.MockException : 
Expected invocation on the mock at least once, but was never performed: x => x.WriteToRegistryKey("MaxNumLogFiles", (Object)10) 

Configured setups: 
x => x.WriteToRegistryKey(It.IsAny<String>(), It.IsAny<Int32>()), Times.Never 

Performed invocations: 
IRegistry.WriteToRegistryKey("MaxNumLogFiles", 10) 

如果我改變我的testRegistry.Verify到:

testRegistry.Verify(x => x.WriteToRegistryKey("MaxNumLogFiles", It.IsAny<object>())); 

它的工作原理,所以這個問題似乎是圍繞第二個參數WriteToRegistryKey方法需要以及int和object之間的區別,但我似乎無法找到 。

感謝您的幫助!

+1

在WriteToRegistryKey的簽名中,您將Object作爲值的類型....因此,任何人將一個int「值」傳遞給您的WriteRegistryKey,它將被隱式裝箱(即成爲一個對象)......我想這會影響驗證。 – 2012-08-02 16:11:03

+0

我認爲問題出現在這方面,我不想改變任何有關WriteToRegistryKey方法的東西,但它必須可以測試它,因爲它以某種方式使用Moq ... – DukeOfMarmalade 2012-08-02 16:25:10

+0

testRegistry.Setup(x => x .WriteToRegistryKey(It.IsAny (),It.IsAny (v =>(v is int)))); ......不知道這是否會起作用....或者在lambda表達式中做類似的事情。 – 2012-08-02 16:44:55

回答

2

這將有助於看到testUtility.UpdateRegistry();的執行體如何在那裏調用.WriteToRegistryKey方法。

不過: 我會刪除行,你設置的testRegistry模擬:
testRegistry.Setup(x => x.WriteToRegistryKey(It.IsAny<string>(), It.IsAny<int>())); 因爲,你要測試它,如果它與正確的參數或不叫。沒有理由使用Moq進行設置。

,如果您的測試與 testRegistry.Verify(x => x.WriteToRegistryKey("MaxNumLogFiles", It.IsAny<object>()));

經過這可能意味着兩件事:

  1. 你WriteToRegistryKey方法被稱爲與其他然後值 - 錯誤的UpdateRegistry方法
  2. 或它的null,因爲您將其設置爲:

It.IsAny<string>(), It.IsAny<int>()

當您使用It.IsAny<type>()它也可能是null

+0

在這裏,一些非常有用的信息,這幫助我更好地理解測試,謝謝你Adronius。 – DukeOfMarmalade 2012-08-03 08:20:20