我正在尝试写这样的测试:
it 'logs events' do
expect(Event).to receive("delay.create!").with(hash_including(
app_context: app_context,
event_type: Event::EventType::FOOD_SUBSCRIPTION_STARTED))
subject
end
代码如下:
Event.delay.create!(
event_type: event_type,
description: 'Automatically populated',
date: Time.now.utc,
eventable: user,
app_context: app_context
)
我想测试一下,在某些时候,使用.delay和.create调用Event,并且传递给create的哈希包含2个键值对。我该怎么做?
Event.delay只返回一长串数字和字母,所以我不认为我想要存根?
答案 0 :(得分:2)
有两种方法。
一种方式(如果第一次调用不大而且很麻烦)只是为了存根第二次调用,例如:
else
另一种方法是为第一个调用创建一个存根,并在第二个调用中使用它,例如:
expect(Event.delay).to receive(:create).with(...).and_return(...)
请注意,根据我的经验,您必须按照给出的顺序执行上述操作才能发挥最佳效果。
答案 1 :(得分:0)
我最终写了一个像这样的测试(结果问题也是那个
Event.delay.create!
在测试中被调用了两次不同的参数,因此我需要使用" ordered"同样。
it 'logs events' do
allow(Event).to receive(:delay).and_return(Event)
expect(Event).to receive(:create!).with(hash_including(
app_context: app_context,
event_type: Event::EventType::FOOD_SUBSCRIPTION_STARTED)).ordered
expect(Event).to receive(:create!).with(hash_including(
app_context: app_context,
event_type: Event::EventType::FOOD_SUBSCRIPTION_COMPLETED)).ordered
subject
end