簡體   English   中英

如果方法沒有返回值,如何驗證它是否被調用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM