只是想知道是否/如何在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
作为存根条件包含在内?
答案 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是参数匹配文档。