无法在receive_message_chain rspec中使用非stubbed方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在receive_message_chain rspec中使用非stubbed方法相关的知识,希望对你有一定的参考价值。
我对receive_message_chain rspec 3.6有一个奇怪的问题
allow_any_instance_of(Order).to receive_message_chain('line_items.find')
{LineItem.first}
当我执行order.line_items而不是返回一个集合时,它返回一个<Double (anonymous)>
对象,这不是我想要的。
有什么建议??
当您告诉RSpec在特定对象上设置receive_message_chain('line_items.find')
时,它需要设置正确的存根以使链工作。
首先,RSpec将方法line_items
存在于对象上。接下来它需要存根方法find
,但是这个方法需要在方法line_items
的返回值上存根。由于我们使用了该方法,因此RSpec需要提供一些返回值,这可以是存根的目标。
因此RSpec将方法line_items
的返回值设置为具有find
方法的匿名双精度。因此,一旦你用receive_message_chain
设置'line_items.find'
,当调用line_items
时,对象将始终返回一个匿名双精度。因为你使用allow_any_instance_of
,这意味着line_items
方法现在存在于Order
的所有实例上。
如果有可能的话,我建议考虑从你的规范中删除allow_any_instance_of
和receive_message_chain
的用法,因为如果你真的无法改变你的代码设计,它们真的是在规范中使用的快捷方式。 https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains
但是,如果无法做到这一点,您可以删除receive_message_chain
并自行设置链。
line_items_stub = double
# or line_items_stub = Order.new.line_items
# or line_items_stub = [LineItem.new, LineItem.new]
# or line_items_stub = the object that you want
allow_any_instance_of(Order).
to receive(:line_items).
and_return(line_items_stub)
allow(line_items_stub).to receive(:find)
如果你能够删除allow_any_instance_of
,你可以使用and_call_original
来调用实际的line_items实现,你正在对message_chain进行存根。
以上是关于无法在receive_message_chain rspec中使用非stubbed方法的主要内容,如果未能解决你的问题,请参考以下文章
无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别