Як сказати "слід_рецепція" більше разів у RSpec


112

Я маю це у своєму тесті

Project.should_receive(:find).with(@project).and_return(@project)

але коли об'єкт отримує виклик цього методу два рази, я повинен це зробити

Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)

Чи є спосіб сказати щось на кшталт

Project.should_receive(:find).with(@project).and_return(@project).times(2)

Відповіді:


214

Це застаріло. Перевірте відповідь Урі нижче

2 рази:

Project.should_receive(:find).twice.with(@project).and_return(@project)

рівно n разів:

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project)

принаймні n разів:

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project)

детальніше на https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expeasures/receive-counts у розділі Отримати рахунки

Сподіваюся, що це допомагає =)


3
Здається, можливо, це не працює any_instance?
Джаред Бек

@YoLudke Я не знаю
Джаред Бек

2
Слід використовувати новий синтаксис, згаданий у відповіді Урі .
theblang

61

Новий expectсинтаксис rspec виглядатиме так:

2 рази:

expect(Project).to receive(:find).twice.with(@project).and_return(@project)

рівно n разів:

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project)

принаймні n разів:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)

1
have_receivedСинтаксис працює також. expect(Project).to have_received(:find).exactly(n).timesі т. д.
Девід Туйте

0

@JredBeck зазначив. Рішення не працювало для мене за any_instanceвикликом.

Для будь-якого випадку я в кінцевому підсумку використовував заглушку замість should_receive.

Project.any_instance.stub(:some_method).and_return("value")

Це буде працювати на будь-який ні. Хоча раз.



0

should_receive, на відміну від any_instance, очікує, що клас отримає повідомлення вказану кількість разів.

any_instance з іншого боку, як правило, використовується для методу заглушки.

Отже, перший випадок - це очікування, яке ми хотіли б протестувати, а другий - переходити метод до наступного рядка, щоб ми могли рухатися далі.


1
Дренмі. Я ціную час, який ти взяв, щоб додати кілька комами до посади, яку я додав майже рік тому ... Це не виглядало так, що змінилися в технічному аспекті відповіді ... Чому б ти відмовився голосувати мені за це ...?
amnsan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.