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

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

问题描述:

使用Microsoft Test Framework和Moq我试图验证是否调用了log4net方法。设置moq并验证是否调用了方法

[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 => moqLog.Info(“做的东西得到了所谓的” )没有安装 配置。没有执行调用。

我在做什么错?

更新问题出在SampleClas.Log属性的getter上。即使该属性已经设置为ILogProxy,我也总是返回LogManager.GetLogger(...);。我的印象是,该物业的get访问者不会被称为,因为我已经设置了这样的代理sampleObject.Log = logMockObject.Object;

+0

是“做的东西得到了所谓的”完全匹配的字符串传递给.INFO? – 2012-01-27 21:09:52

+1

'sampleObject.DoStuffAndLogInfo()'做了什么? – 2012-01-27 21:10:43

+0

不是。参数是否重要?我认为只要你传递了一些信息,参数就不重要了。 – 2012-01-27 21:10:58

该测试已正确设置。

检查您的sut以查看Log.Info是否实际上在DoStuffAndLogInfo方法内调用。

+0

我同意这个答案。为了给自己一些想法,使用我的SampleClass运行相同的测试,您将看到测试成功。 'public class SampleClass {public void Log(ILog log){log.Warn(“do something got called”); }}' – 2012-01-27 21:17:26

+0

@JohnRuiz正确,我也使用过这样的类 - 只有它是'Info'而不是'Warn' – GolfWolf 2012-01-27 21:22:00

+0

有意义。我做了这个改变,但我也不得不做出另一个改变。请参阅我的问题更新。 – 2012-01-27 21:28:58

现在Moq正在验证DoStuffAndLogInfo调用Info确切的字符串“做的东西被调用”。如果它的实际调用Info用不同的参数,和你不关心实际的参数是什么,请使用以下代替:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
+0

有道理。我做了这个改变,但我也不得不做出另一个改变。请参阅我的问题更新。 – 2012-01-27 21:28:40

+0

您为日志创建了一个模拟,但不是'SampleClass'。如果'SampleClass.DoStuffAndLogInfo'访问'this.Log',它仍然会调用''''''''SampleClass.Log'的访问器。 – 2012-01-27 21:36:51