如何测试 rspec 中的方法链。延迟是其中之一
How to test chains of methods in rspec. Delay is one of them
我正在尝试编写这样的测试:
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 只是 returns 一长串数字和字母所以我不认为我想存根?
有几种方法。
一种方法(如果第一个调用不是大而杂乱的,这种方法可行)只是对第二个调用进行存根,例如:
expect(Event.delay).to receive(:create).with(...).and_return(...)
另一种方法是为第一个调用创建一个存根并在第二个调用中使用它,例如:
delay_stub = double
expect(delay_stub).to receive(:create).with(...).and_return(...)
expect(Event).to receive(:delay).with(...).and_return(delay_stub)
请注意,根据我的经验,您必须按照给出的顺序执行上述操作才能发挥最佳效果。
我最终写了一个这样的测试(原来问题也是
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
我正在尝试编写这样的测试:
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 只是 returns 一长串数字和字母所以我不认为我想存根?
有几种方法。
一种方法(如果第一个调用不是大而杂乱的,这种方法可行)只是对第二个调用进行存根,例如:
expect(Event.delay).to receive(:create).with(...).and_return(...)
另一种方法是为第一个调用创建一个存根并在第二个调用中使用它,例如:
delay_stub = double
expect(delay_stub).to receive(:create).with(...).and_return(...)
expect(Event).to receive(:delay).with(...).and_return(delay_stub)
请注意,根据我的经验,您必须按照给出的顺序执行上述操作才能发挥最佳效果。
我最终写了一个这样的测试(原来问题也是
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