如何在rspec中测试方法链。延迟就是其中之一

时间:2016-04-12 20:30:40

标签: ruby-on-rails-3 rspec

我正在尝试写这样的测试:

  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只返回一长串数字和字母,所以我不认为我想要存根?

2 个答案:

答案 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