【问题标题】:Setting up moq and verifying that a method was called设置起订量并验证是否调用了方法
【发布时间】:2012-01-27 21:04:58
【问题描述】:

使用 Microsoft 测试框架和 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 => moqLog.Info("do stuff got called") 无设置 配置。未执行任何调用。

我做错了什么?

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

【问题讨论】:

  • “do stuff got called”是传递给 .Info 的确切字符串吗?
  • sampleObject.DoStuffAndLogInfo() 是做什么的?
  • 不。参数重要吗?我认为参数无关紧要,只要你传递一些东西给它。
  • @MichaelLiu 它调用 Log.Info 其中 Log 是 log4net 的 ILog 实例
  • 是的,参数很重要。如果您只是想测试它是否被任何字符串调用,请使用It.IsAny&lt;string&gt;() 作为参数。

标签: c# .net tdd moq


【解决方案1】:

现在,Moq 正在验证 DoStuffAndLogInfo 是否使用 确切的字符串调用 Info “do stuff got called”。如果它实际上使用不同的参数调用 Info,而您并不关心实际参数是什么,请改用以下内容:

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

【讨论】:

  • 有道理。我做了这个改变,但我还必须做出另一个改变。请查看我对这个问题的更新。
  • 您为日志创建了一个模拟,但没有为 SampleClass 创建一个模拟。如果SampleClass.DoStuffAndLogInfo 访问this.Log,它仍然会为SampleClass.Log 调用您的get 访问器。
【解决方案2】:

测试设置正确。

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

【讨论】:

  • 我同意这个答案。为了让自己放心,用我的 SampleClass 运行相同的测试,你会看到你的测试成功了。 public class SampleClass { public void Log(ILog log) { log.Warn("do stuff got called"); } }
  • @JohnRuiz 正确,我也使用过这样的类 - 只是它是 Info 而不是 Warn
  • 有道理。我做了这个改变,但我还必须做出另一个改变。请查看我对这个问题的更新。
【解决方案3】:

这看起来不是原始海报的问题,但在我的情况下,我收到了非常相似的错误消息。这是由于我的.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()); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2021-10-19
    相关资源
    最近更新 更多