设置moq并验证方法是否被调用

时间:2012-01-27 21:04:58

标签: c# .net tdd moq

使用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;

3 个答案:

答案 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());