无法在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_ofreceive_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方法的主要内容,如果未能解决你的问题,请参考以下文章

包无法在 R 中卸载:无法安装包

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

无法在春季导入 org.apache.poi,因此无法编译

无法理解为啥计算在没有手表的情况下无法工作

React 无法编译模块未找到:无法在listingDetail 上解析

为啥 Today Widget 在 iOS 14 上显示“无法加载”且无法调试?