我在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主人都在关心给我一些指导吗?
答案 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。
如果您不关心订单,也许您可以存根此查询,以便始终获得相同的结果? 此外,它还可以让您的测试更快。