2015-07-24 2 views
1

Мне нужно сделать утверждение о том, будет ли путь кода регистрировать конкретное событие.Утверждение аргумента нескольких вызовов в RSpec 3

Предположим, что в моем коде:

Logging::Tracking.logger.log_event(event_name: 'some event') 
Logging::Tracking.logger.log_event(event_name: 'some other event') 
Logging::Tracking.logger.log_event(
    event_name: 'cool_event', 
    event_data: { request_id: @request.id, user_id: @user.id } 
) 

в спецификации:

allow(Logging::Tracking.logger).to receive(:log_event) 
expect(Logging::Tracking.logger).to receive(:log_event) do |params| 
    expect(params[:event_name]).to eq('cool_event') 
    expect(params[:event_data][:request_id]).to eq(@request.id) 
    expect(params[:event_data][:user_id]).to eq(@user.id) 
end 

Это утверждение было бы справедливо в RSpec 2, однако, в RSpec 3, тест провалится с:

Failure/Error: expect(params[:event_name]).to eq('cool_event') 

    expected: "cool_event" 
    got: "some event" 

    (compared using ==) 

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

Спасибо,

ответ