Як перевірити, що метод не викликався в Moq?


466

Як я можу перевірити, що метод не викликався в Moq ?

Чи є в ньому щось на кшталт AssertWasNotCalled?

ОНОВЛЕННЯ: Починаючи з версії 3.0, новий синтаксис можна використовувати:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

Відповіді:


155

ОНОВЛЕННЯ : Починаючи з версії 3, перевірте оновлення вищезазначеного питання або відповідь Данна нижче.

У будь-якому випадку, зробіть ваш макет суворим, тому він не вийде, якщо ви зателефонуєте на метод, на який ви не очікуєте

new Mock<IMoq>(MockBehavior.Strict)

Або, якщо ви хочете, щоб ваш макет був вільним, використовуйте .Throws (Виняток)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
... або Callback (), щоб встановити прапор, який можна стверджувати.
alex

2
Також з варіантом №2 ви не можете мати VerifyAll у загальному методі Teardown - він не зможе сказати, що очікування не було виконано; коли тест повинен ідеально пройти.
Gishu

51
Це насправді не "перевірка не викликається", оскільки її можна було б зафіксувати в рамках методу і все одно працюватиме - надаючи помилковий позитив!
День

4
Тепер очікування застаріло
Томаш Сікора

5
Це міг бути найкращим способом у 2009 році, але, безумовно, не зараз. вибачте
Фабіо Мілхейро

537

Виконайте перевірку після тесту, у якому Times.Neverвстановлено перерахунок. напр

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
Тут важливо те, що дзвінок Verify (дія, ніколи) не відбувається після виклику макета. Я подумав, що це налаштування перевірки для виклику VerifyAll () пізніше (що не працює)
piers7

Простий і ефективний. Дякую.
Ян Грінґер

45

Вкрадено з відповіді Джона Фостера на запитання "Потрібна допомога, щоб краще зрозуміти Мок"

Однією з речей, які ви можете перевірити, є те, що метод оплати не викликається, коли людина, старша 65 років, переходить в метод

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock<IPensionService>();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

10

Це не працює в останніх версіях Moq (оскільки принаймні 3.1), його слід вказати у Verifyспособі, як зазначено у відповіді.

Насправді, краще вказати .AtMost(0)після оператора Returns.

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

Хоча «кидки» теж спрацьовують, AtMost(0)IMHO є більш виразним.


-5

Використовуйте .AtMostOnce ();

Після реального тестування знову зателефонуйте до методу. Якщо він кидає виняток, його називали.


1
Чи не занадто незрозуміло, щоб стверджувати, що виняток був кинутий глузуючим фреймворком?
alex

Чому? Просто перевірте тип винятку. Якщо це один кинув мого Moq, ти в безпеці.
Аарон Дігулла

8
Використання Verify with Times. Ніколи не є кращим вибором ... Я погоджуюся з alex, що це рішення працює, але, безумовно, малозрозуміле.
Звуковий сигнал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.