监视同一命名空间的 类

Spying on Classes of the Same Namespace

我正在为属于同一个命名空间的两个 classes 创建间谍,目的是希望每个都收到特定的参数:

allow(SibApiV3Sdk::SendSmtpEmail).to receive(:new).and_return(seb_send_email)
allow(SibApiV3Sdk::SMTPApi).to receive(:new).and_return(seb_smtp_api)

def seb_send_email
  @seb_smtp_api ||= SibApiV3Sdk::SendSmtpEmail.new(email_params)
end

def seb_smtp_api
  @seb_smtp_api ||= SibApiV3Sdk::SMTPApi.new
end

当我这样做时,第二个间谍无法正常工作,而是 returns 第一个间谍对象。我怀疑这与它是一个命名空间 class 有关。这是预期的行为吗?是否有处理命名空间 class 间谍的替代方法?

您将两者都分配给 @seb_smtp_api 变量,这就是问题的根源。

您可能首先调用 seb_send_email 方法,然后它被记忆为 @seb_smtp_api,当您调用 seb_smtp_api 时它只是 returns 记忆值。

您可以通过将 allow 替换为 expect 来检查并查看 SibApiV3Sdk::SMTPApinew 方法从未被调用。