RSpec spy match_array的哈希值

时间:2017-10-14 17:21:23

标签: ruby rspec ruby-on-rails-5

我在RSpec控制器规范中有一个简单的测试,它检查是否将正确的消息传递给延迟的作业:

it 'sends a message to NotifyFollowersJob with relevant person and split_time data' do
  allow(NotifyFollowersJob).to receive(:perform_later)
  post :import, params: request_params
  split_time_ids = SplitTime.all.ids
  person_id = SplitTime.first.effort.person_id

  expect(NotifyFollowersJob).to have_received(:perform_later)
                                        .with(person_id: person_id,
                                              split_time_ids: split_time_ids)
end

测试通常会通过,但有时会失败,因为split_time_ids(数组)有时会反转。我不关心将split_time_ids传递给NotifyFollowersJob的顺序,因此无论顺序如何,测试都应该通过。

如果我单独测试数组的内容,我可以写:

expect(split_time_ids).to match_array(SplitTime.all.ids)

但我无法弄清楚如何获得类似的功能,其中Array是多个参数之一的值。

任何RSpec主人都在关心给我一些指导吗?

2 个答案:

答案 0 :(得分:1)

一个想法是创建一个块来检查邮件并将其传递给您的allow方法。

像这样:

allow(NotifyFollowersJob).to receive(:perform_later) do |arg|
  # Handle your args to avoid fails because of its order
  expect(...)
end

您应该保留expect(NotifyFollowersJob).to have_received(:perform_later)(不需要with验证),以确保它仍然被调用。

答案 1 :(得分:-1)

看起来您的控制器操作会运行SplitTime.all.ids查询并将其作为args传递给worker。

如果您不关心订单,也许您可​​以存根此查询,以便始终获得相同的结果? 此外,它还可以让您的测试更快。