Как проверить, что метод был вызван, если он не возвращает значения? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь подготовить фиктивный объект с помощью Moq для тестирования метода (SaveNewPersonAsync()), который вызывает метод LogMessage в моем объекте Logger. SaveNewPersonAsync() не возвращает никакого значения (ну, кроме Task <>, поскольку это asyn c), но, как я понял из руководств Moq, я должен проверять возвращаемое значение метода. А также метод mock.Verify всегда проходит для меня, даже если я не вызываю SaveNewPersonAsync(). Как я могу проверить, что внутри него были вызваны 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

1 Ответ

0 голосов
/ 14 июля 2020

// verify () проходит, даже если я не вызываю метод SaveNewPersonAsyn c ()

Это потому, что вы вызываете его здесь (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
...