Я постараюсь завершить ответ @ ema, возможно, он даст больше информации читателям. Представьте, что у вас есть смоделированный объект, который зависит от вашего sut . Допустим, у него есть два метода, и вы хотите настроить их, чтобы не получать никаких исключений или создавать различные сценарии для вашего sut :
var fooMock = new Mock<Foo>();
fooMock.Setup(f => f.Eat()).Returns("string");
fooMock.Setup(f => f.Bark()).Returns(10);
_sut = new Bar(fooMock.Object);
Итак, это был шаг . Теперь вы хотите запустить какой-то метод, который хотите протестировать (теперь вы act ):
_sut.Test();
Теперь вы будете утверждать с VerifyAll()
:
fooMock.VerifyAll();
Что вы здесь будете тестировать? Вы проверите, были ли ваши setup методы названы . В этом случае, если либо Foo.Eat() or Foo.Bark()
не было вызвано, вы получите исключение, и тест не пройден. Так что, на самом деле, вы смешиваете аранжируете и утверждаете шаги. Кроме того, вы не можете проверить, сколько раз он был вызван, что вы можете сделать с .Verify
(представьте, что у вас есть некоторый параметр Param
со свойством Name
в вашей функции Eat()
):
fooMock.Verify(f => f.Eat(It.Is<Param>(p => p.Name == "name")), Times.Once);