Как проверить, что метод был вызван ровно один раз с помощью Moq? Verify()
Против Verifable()
вещь действительно заблуждение.
112
Вы можете использовать Times.Once()
, или Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
Вот методы класса Times :
AtLeast
- Указывает, что фиктивный метод должен вызываться как минимум раз.AtLeastOnce
- Указывает, что фиктивный метод должен вызываться как минимум один раз.AtMost
- Указывает, что фиктивный метод должен вызываться максимальное время.AtMostOnce
- Указывает, что фиктивный метод должен быть вызван максимум один раз.Between
- Указывает, что фиктивный метод должен вызываться между от и до времени.Exactly
- Указывает, что фиктивный метод должен вызываться ровно раз.Never
- Указывает, что фиктивный метод не должен вызываться.Once
- Указывает, что фиктивный метод должен быть вызван ровно один раз.Просто помните, что это вызовы методов; Я все время сбивался с толку, думая, что это свойства, и забывая о скобках.
var mockContext = new Mock<IContext>()
чтобы это настроить.AtLeast
,AtMost
,Between
илиExactly
можно было бы рассматривать как собственность. Я имею в виду, что им, очевидно, нужен параметр, чтобы что-то делать.Представьте, что мы создаем калькулятор с одним методом сложения двух целых чисел. Давайте представим себе, что при вызове метода добавления он вызывает метод печати один раз. Вот как мы это протестируем:
А вот собственно тест с комментариями в коде для уточнения:
Примечание . По умолчанию Moq заглушит все свойства и методы, как только вы создадите объект Mock. Таким образом, даже без вызова
Setup
Moq уже заглушил методы,IPrinter
поэтому вы можете просто позвонитьVerify
. Однако в качестве хорошей практики я всегда настраиваю его, потому что нам может потребоваться принудительно применить параметры метода, чтобы удовлетворить определенные ожидания, или возвращаемое значение метода, чтобы удовлетворить определенные ожидания, или количество раз, когда он был вызван.источник
Verify
,Times.Once
но не звонилSetup
. Я, конечно, ожидал,Verify
что в этом случае взорвется, но этого не произошло.Mock
объект. Таким образом, даже без вызоваSetup
Moq уже заглушил методы,IPrinter
поэтому вы можете просто позвонитьVerify
. Однако в качестве хорошей практики я всегда настраиваю его, потому что нам может потребоваться принудительно применить параметры к методу или возвращаемое значение из метода.Times.Exactly(1)
и он не потерпел неудачу, когда метод фактически был вызван дважды. Только после добавленияSetup
рассматриваемого метода произошла ошибка.Контроллер тестирования может быть:
И когда метод DeleteCars вызывается с действительным идентификатором, мы можем проверить это, метод удаления службы вызывается ровно один раз в этом тесте:
источник