rspec允许where(id:my_id).first

时间:2016-03-08 14:07:34

标签: ruby-on-rails ruby testing rspec

我正在编写一个关于rspec的测试,需要为Location模型允许以下行:

Location.where(id: params[:id]).first

但这是不正确的(两个参数而不是一个错误):

allow(Location).to receive(:where, :first).with(id: my_id)

这就是:

allow(Location).to receive(:where).with(id: my_id).first

哪种方法是正确的?

2 个答案:

答案 0 :(得分:3)

你可以做到:

allow(Location).to receive(:where).with(id: my_id).and_return double(first: <your Location mock here>)

答案 1 :(得分:0)

where返回一个关系(可枚举的类型或集合)。因此,如果你想模仿你的位置,你需要返回某种类型的集合:

allow(Location).to receive(:where).with(id: my_id).and_return([double('result')])

也就是说,你可以随时替换where(...)的模式。首先使用find_by(...):

Location.find_by(id: params[:id])
allow(Location).to receive(:find_by).with(id: my_id).and_return(double('result'))

这样您就不需要返回集合,以便可以先调用它。你立即得到第一个结果。

如果你真的无法修改代码并且也无法修改结果 - 你基本上只想允许特定的合同 - 那么你可以按照Working with legacy code section中的描述使用message_chains:

allow(Location).to receive_message_chain(:where, :first)