在RSpec 3中断言多个调用的参数

时间:2015-07-24 00:05:40

标签: ruby-on-rails ruby unit-testing rspec rspec3

我需要断言代码路径是否会记录特定事件。

假设在我的代码中:

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断言。

谢谢,

1 个答案:

答案 0 :(得分:0)

您可以使用.with来预期散列,而不是在每个参数上设置期望。

expect(Logging::Tracking.logger).to receive(:log_event).with(
  event_name: 'cool_event',
  request_id: @request.id,
  user_id: @user.id
)
  

https://relishapp.com/rspec/rspec-mocks/docs/setting-constraints/matching-arguments