使用Microsoft Test Framework和Moq我正在尝试验证是否调用了log4net方法。
[TestMethod()]
public void Log_Info_When_Stuff_Is_Done()
{
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce());
}
我在验证电话上说“
”时遇到异常模拟上的预期调用至少一次,但从来没有 执行:moqLog =&gt; moqLog.Info(“do stuff got called”)没有设置 配置。没有进行调用。
我做错了什么?
更新问题出在SampleClas.Log属性的getter上。即使属性已设置为ILogProxy,我也总是返回LogManager.GetLogger(...);
。我的印象是,我不会调用属性的get访问器,因为我已经设置了这样的代理sampleObject.Log = logMockObject.Object;
答案 0 :(得分:34)
目前,Moq正在验证DoStuffAndLogInfo
使用完全字符串调用Info
&#34;是否已调用#34;。如果它实际上使用不同的参数调用Info
,并且您不关心实际参数是什么,请使用以下代码:
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
答案 1 :(得分:1)
测试已正确设置。
检查 sut 以查看Log.Info
方法中是否实际调用了DoStuffAndLogInfo
。
答案 2 :(得分:0)
这似乎不是原始海报的问题,但就我而言,我有非常相似的错误消息。这是由于我的.Verify()
在实际执行之前 的调用。例如,这是错误:
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
....但这是正确:
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());