【问题标题】:How to verify a method was called if it returns no value?如果方法没有返回值,如何验证它是否被调用?
【发布时间】:2020-07-14 14:27:48
【问题描述】:

我正在尝试使用 Moq 准备一个模拟对象来测试在我的 Logger 对象中调用 LogMessage 方法的方法 (SaveNewPersonAsync())。 SaveNewPersonAsync() 不返回任何值(嗯,除了 Task 因为它是异步的)但是,正如我从 Moq 教程中了解到的那样,我应该验证方法的返回值。而且,即使我不调用SaveNewPersonAsync(),mock.Verify 方法也总是通过。如何验证其中的SaveNewPersonAsync()LogMessage() 是否被调用?

// Create the mock
var mock = new Mock<ILogger>();

// Configure the mock to do something
mock.Setup(x => x.LogMessage("test")).Returns(true);

// Demonstrate that the configuration works
Assert.AreEqual(true, mock.Object.LogMessage("test"));


// perform the db saving here
var dataproc = new DataProcessor(mock.Object, new UserDbMongo(), new ParsingManager());
await dataproc.SaveNewPersonAsync(GenerateJsonData("CocaColaParser"));


mock.Verify(x => x.LogMessage("test"));
// verify() passes even if I don't call the SaveNewPersonAsync() method

SaveNewPersonAsync() 方法,简化:

await _dbmanager.InsertUserAsync(person);
_logger.LogMessage("Saved a user to db."); // if this is not here, the test should fail

【问题讨论】:

  • 既然您在测试await dataproc.SaveNewPersonAsync.. 中显式调用了该方法,为什么需要检查它是否被调用?
  • 好的,所以我想,我只需要检查是否调用了其他方法(LogMessage,在 SaveNewPersonAsync 中)?

标签: c# unit-testing moq


【解决方案1】:

// verify() 通过,即使我不调用 SaveNewPersonAsync() 方法

因为你在这里调用它(mock.Object.LogMessage("test")):

Assert.AreEqual(true, mock.Object.LogMessage("test"));

即使您不调用SaveNewPersonAsync(),也会调用该方法以便模拟通过。删除上面的行,你会得到预期的行为。

另外,如果你的方法没有返回任何值,那么你不需要设置它。

最后的代码应该是:

// Create the mock
var mock = new Mock<ILogger>();      

// perform the db saving here
var dataproc = new DataProcessor(mock.Object, new UserDbMongo(), new ParsingManager());
await dataproc.SaveNewPersonAsync(GenerateJsonData("CocaColaParser"));
    
mock.Verify(x => x.LogMessage("test")); // now it should behave as you expect

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多