ruby-on-rails - 在 RSpec 3 中断言多个调用的参数

标签 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 断言来完成。

谢谢,

最佳答案

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

关于ruby-on-rails - 在 RSpec 3 中断言多个调用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600112/

相关文章:

ruby-on-rails - Rails 4,Bootstrap-sass 3 : glyphicons not showing in production

ruby-on-rails - Ruby 验证安全 ldap 服务器的证书

sql - 对 Rails/Heroku 上的 Postgres 数据库的意外 SQL 查询

ruby-on-rails - 如何使用 Capistrano 2 部署 Rails 4 并在本地预编译 Assets

ruby-on-rails - 安装therubyracer(0.10.1)时发生错误

Ruby 怪异的赋值行为

ruby-on-rails - 如何在 Rails 3.1 应用程序中拥有唯一的 session ID

c++ - 无法使用现有代码在 Netbean C++ 项目中添加测试

java - 验证 Mockito 中同一方法的后续调用的参数

python - 测试 : testing a websocket connection