RSpec:带有参数的Stub链?

时间:2011-11-03 23:57:05

标签: ruby-on-rails rspec stub

只是想知道是否/如何在rspec存根链中传递参数。举个例子,假设我有以下行动:

def index
  @payments = Payment.order(:updated_at).where(:paid => true)
  @bad_payments = Payment.order(:some_other_field).where(:paid => false)
end

在我的控制器规范中,我希望能够存根两种方法并返回不同的结果。如果动作中只有@payments字段,我会使用类似

的内容
Payment.stub_chain(:order, :where) { return_this }

但是,当然,这将为@bad_payments返回相同的值。

所以 - 简而言之,如何将:updated_at:paid => true作为存根条件包含在内?

3 个答案:

答案 0 :(得分:23)

您可以使用:

Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }

答案 1 :(得分:15)

您可以使用嵌套的存根块。该块可以接受参数,返回值用作函数返回值。

我使用tap,因为stub不会返回被叫方。由double创建的模拟作为方法order的结果返回,where方法又是存根。

Payment.stub(:order) { |order|
  double('ordered_payments').tap { |proxy|
    proxy.stub(:where) { |where|
      [order, where]
    }
  }
}

Payment.order(:updated_at).where(:paid => true)
# => returns [:updated_at, {:paid => true}]

答案 2 :(得分:15)

rspec > 3使用以下语法:

expect(Converter).to receive_message_chain("new.update_value").with('test').with(no_args)

而不是stub_chain

详细了解消息链in the documenation。并且here是参数匹配文档。