rspec, 2 пути одинаковы?

@sponge = Factory(:user)
let(:event_type) { EventType.where( name: 'visit_site').first 

ONE: => false при запуске теста

subject{ Event.new user: @sponge, event_type: event_type, points_earned: event_type.points_value, description: {}}

context 'call #update_user_points when create a event' do
   it{should_receive(:update_user_points)}
end

ДВА: => верно при запуске теста

it 'should call update_user_points after creation' do
   event = Event.new user: @sponge, event_type: event_type, points_earned:event_type.points_value, description: {}
   event.should_receive(:update_user_points)
   event.save
end

Посоветуйте пожалуйста :D


person Peter89    schedule 14.03.2012    source источник


Ответы (1)


Ваш второй пример отличается от первого: они оба устанавливают ожидание сообщения для Event#update_user_points, но после этого второй вызывает save; первый нет.

Я не думаю, что вы можете использовать should_receive с неявным подлежащим, как вы пытаетесь сделать в первом примере. rspec, кажется, не жалуется, но я не думаю, что он делает то, что вы хотите. По порядку делает так:

  1. Запускает блок темы для создания экземпляра события.
  2. Устанавливает ожидание сообщения о том, что субъект (ново созданное событие) должен получить метод update_user_points.
  3. Затем он останавливается, потому что в примере больше ничего нет.

Это терпит неудачу, потому что сообщение никогда не было получено.

person Rob Davis    schedule 14.03.2012
comment
Я немного понимаю в rspec, например, почему мы должны поместить should_receive перед event.save. Я думаю, что он запускает update_user_points после создания события, его следует размещать после этого? И я думаю, что первый путь должен работать нормально? Можете ли вы дать мне что-нибудь полезное, чтобы узнать о rspec для начинающих. спасибо :D - person Peter89; 15.03.2012