首页 > 解决方案 > RSpec 模拟具有嵌套属性的类

问题描述

我对 Ruby 和 RSpec 非常陌生,并且在尝试模拟类中的属性链时遇到了麻烦:

client.conversations.configuration.update(sid: user.sid)

我已经像这样嘲笑客户:

let(:client) { class_double(Service::ClientFactory) }

但是,这是我使用该方法尝试并失败的receive方法,该方法不起作用。

  allow(client).to receive(conversations.configuration.update).and_return("123123123")

我怎样才能正确地做到这一点?谢谢!

标签: rubyunit-testingrspec

解决方案


您可能想使用receive_message_chain

allow(
  client
).to receive_message_chain(:conversations, :configuration, update: "123123123")

但也请查看该页面上的部分:

警告:

链可以任意长,这使得以暴力方式违反德墨忒耳法则非常容易,因此您应该将任何使用 receive_message_chain 视为代码异味。[...]


推荐阅读