【问题标题】:Asserting argument of multiple calls in RSpec 3在 RSpec 3 中断言多个调用的参数
【发布时间】:2015-07-24 00:05:39
【问题描述】:

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

假设在我的代码中:

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

谢谢,

【问题讨论】:

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


    【解决方案1】:

    您可以使用.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

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2022-07-06
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多