Подтвердить что ты не робот

Как добавить несколько ожиданий if_receive на объект с помощью RSpec?

В моем контроллере Rails я создаю несколько экземпляров одного и того же класса модели. Я хочу добавить некоторые ожидания RSpec, поэтому я могу проверить, что он создает правильный номер с правильными параметрами. Итак, вот что у меня в моей спецификации:

Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => @user.id, :position_id => 1, :is_leader => true)
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "2222", :position_id => 2)
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "3333", :position_id => 3)
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "4444", :position_id => 4)

Это вызывает проблемы, потому что кажется, что класс Bandmate может иметь только 1 "should_receive" ожидание, установленное на нем. Итак, когда я запускаю этот пример, я получаю следующую ошибку:

Spec::Mocks::MockExpectationError in 'BandsController should create all the bandmates when created'
Mock 'Class' expected :create with ({:band_id=>1014, :user_id=>999, :position_id=>1, :is_leader=>true}) but received it with ({:band_id=>1014, :user_id=>"2222", :position_id=>"2"})

Это правильные параметры для второго вызова для создания, но RSpec тестирует неправильные параметры.

Кто-нибудь знает, как я могу настроить свои ожидаемые требования should_receive, чтобы разрешить несколько разных вызовов?

4b9b3361

Ответ 1

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

Короче говоря, вы должны добавить .ordered к концу каждого из ваших ожиданий.

Ответ 2

Макет получаемых платежей

my_mock.should_receive (: SYM).once
my_mock.should_receive (: SYM).twice
my_mock.should_receive (: SYM).exactly(п) & bull;
my_mock.should_receive (: SYM).at_least (: один раз)
my_mock.should_receive (: SYM).at_least (: дважды)
my_mock.should_receive (: SYM).at_least (п) & bull;
my_mock.should_receive (: SYM).at_most (: один раз)
my_mock.should_receive (: SYM).at_most (: дважды)
my_mock.should_receive (: SYM).at_most (п) & bull;
my_mock.should_receive (: sym).any_number_of_times

Работает и для rspec 2.5.