如何测试 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