Я прочитал вопрос в Какова цель проверки() в Moq? и задайте этот вопрос в моем сознании. Нужна ваша помощь, чтобы объяснить это.
Какова цель VerifyAll() в Moq?
Ответ 1
VerifyAll()
предназначен для проверки того, что все ожидания выполнены.
Предположим, что у вас есть:
myMock.Setup(m => m.DoSomething()).Returns(1);
mySut.Do();
myMock.VerifyAll(); // Fail if DoSomething was not called
НТН
Ответ 2
Я постараюсь завершить ответ @ema, возможно, это даст больше информации читателям. Представьте, что вы высмеяли объект, который является зависимостью от вашего сута. Допустим, у него есть два метода, и вы хотите настроить их, чтобы не получать никаких исключений или создавать различные сценарии для вашего пакета:
var fooMock = new Mock<Foo>();
fooMock.Setup(f => f.Eat()).Returns("string");
fooMock.Setup(f => f.Bark()).Returns(10);
_sut = new Bar(fooMock.Object);
Так что был устроен шаг. Теперь вы хотите запустить некоторый метод, который вы хотите на самом деле проверить (теперь вы действуете):
_sut.Test();
Теперь вы будете утверждать с VerifyAll()
:
fooMock.VerifyAll();
Что вы здесь будете тестировать? Вы проверите, были ли вызваны ваши методы настройки. В этом случае, если Foo.Eat() or Foo.Bark()
не были вызваны, вы получите исключение, и тест завершится неудачей. Итак, на самом деле, вы смешиваете аранжировки и утверждаете шаги. Кроме того, вы не можете проверить, сколько раз он был вызван, что вы можете сделать с помощью .Verify
(представьте, что у вас есть некоторый параметр Param
со свойством Name
в вашей функции Eat()
):
fooMock.Verify(f => f.Eat(It.Is<Param>(p => p.Name == "name")), Times.Once);