我正在使用Moq來驗證一個方法是否在我的單元測試中被調用。在這個特定情況下,我想測試被測方法是否通過log4net記錄錯誤。問題是,這可以通過調用log.Error
或log.ErrorFormat
來完成。兩者都很好。如何驗證兩種方法之一是否已被調用?
我該如何驗證?我只知道如何確認他們都被叫了。
var logMock = new Mock<ILog>();
var myClass = new MyClass(logMock.Object);
myClass.MyMethod();
logMock.Verify(log => log.Error(It.IsAny<object>()));
logMock.Verify(log => log.ErrorFormat(It.IsAny<string>(), It.IsAny<object>()));
現在我想起來了,他們都有一堆重載的,我不介意任何重載的被稱爲是(我開始懷疑這是一個很好的測試)。
在此先感謝。
編輯:我只是想的東西討厭:
try
{
logMock.Verify(log => log.Error(It.IsAny<object>()));
}
catch (Moq.MockException ex)
{
logMock.Verify(log => log.ErrorFormat(It.IsAny<string>(), It.IsAny<object>()));
}
也許我可以在某種擴展方法的包裝這個...例如VerifyAny
。
我VerifyAny的版本是關於那個以外,我沒有不一樣考慮類型約束並收集例外。這個用法實際上比CallBack方法更簡潔。或者是捕捉那樣的例外是一個壞主意?嗯...... –
@MatthijsWessels捕捉像這樣的預期異常感覺有點骯髒,但對於單元測試項目,我不會擔心性能太多。也許最好有一個'Mock .SetupAny'方法來代替注入回調並返回一個布爾值。 –