【发布时间】: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