[英]How to verify a method was called if it returns no value?
我正在嘗試使用 Moq 准備一個模擬 object 來測試在我的 Logger object 中調用 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
// 即使我不調用 SaveNewPersonAsync() 方法,verify() 也會通過
這是因為您在這里調用它( 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.