设置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;
该测试已正确设置。
检查您的sut以查看Log.Info
是否实际上在DoStuffAndLogInfo
方法内调用。
我同意这个答案。为了给自己一些想法,使用我的SampleClass运行相同的测试,您将看到测试成功。 'public class SampleClass {public void Log(ILog log){log.Warn(“do something got called”); }}' – 2012-01-27 21:17:26
@JohnRuiz正确,我也使用过这样的类 - 只有它是'Info'而不是'Warn' – GolfWolf 2012-01-27 21:22:00
有意义。我做了这个改变,但我也不得不做出另一个改变。请参阅我的问题更新。 – 2012-01-27 21:28:58
现在Moq正在验证DoStuffAndLogInfo
调用Info
与确切的字符串“做的东西被调用”。如果它的实际调用Info
用不同的参数,和你不关心实际的参数是什么,请使用以下代替:
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
有道理。我做了这个改变,但我也不得不做出另一个改变。请参阅我的问题更新。 – 2012-01-27 21:28:40
您为日志创建了一个模拟,但不是'SampleClass'。如果'SampleClass.DoStuffAndLogInfo'访问'this.Log',它仍然会调用''''''''SampleClass.Log'的访问器。 – 2012-01-27 21:36:51
是“做的东西得到了所谓的”完全匹配的字符串传递给.INFO? – 2012-01-27 21:09:52
'sampleObject.DoStuffAndLogInfo()'做了什么? – 2012-01-27 21:10:43
不是。参数是否重要?我认为只要你传递了一些信息,参数就不重要了。 – 2012-01-27 21:10:58