我正在编写一个关于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
哪种方法是正确的?
答案 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)