Как сказать «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

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

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

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


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