Как сказать «should_receive» больше раз в 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-expectations/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

@JaredBeck указал. Решение не помогло мне по any_instanceвызову.

В любом случае я использовал заглушку вместо should_receive.

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

Это будет работать в любом случае. хотя раз.

Прасанна
источник
0

should_receive, в отличие от any_instance, ожидает, что класс получит сообщение указанное количество раз.

any_instance с другой стороны, обычно используется для заглушки метода.

Итак, первый случай - это ожидание, которое мы хотели бы протестировать, а второй - прохождение метода к следующей строке, чтобы мы могли двигаться дальше.

Амнсан
источник
1
Дренми, я ценю время, которое вы потратили на то, чтобы добавить несколько запятых к сообщению, которое я добавил почти год назад ... Не похоже, что было какое-либо изменение в техническом аспекте ответа ... Почему вы голосовали против меня за это ...?
amnsan