0

我有点新rspec-mock,现在我正在集成hominid以与 Mailchimp 通信,我想存根一些方法调用,所以我的请求实际上并没有发送到 Mailchimp。这就是我正在做的

配置/初始化程序/mailchimp.rb

MAILCHIMP = Hominid::API.new(ENV['MAILCHIMP_API_KEY'])
LIST_ID   = ENV['MAILCHIMP_LIST_ID']

用户.rb

class User < ActiveRecord::Base
  before_create :add_subscription
  private
    def add_subscription
      MAILCHIMP.list_subscribe(LIST_ID, .......) # Some params following
    end
end

如您所见,对于创建的每个用户,list_subscribe都会调用a MAILCHIMP,现在我不希望list_subscribe在每个测试中都被实际调用,因为User到处都在使用,所以我在全局范围内配置了一个像这样的存根:

规范/spec_helper.rb

RSpec.configure do |config|
  config.before(:each) do
    allow_any_instance_of(Hominid::API).to receive(:list_subscribe).and_return(true)
  end
end

我预计MAILCHIMPinstance 不会调用list_subscribe而只是 return true,因为如果list_subscribe被调用,一些意外请求将转到 Mailchimp,我想防止这种情况发生。但是我上面的代码不起作用,我错了什么?如何解决这个问题?

此外,答案可能与我的情况类似How should I stub a method global using RSpec?

我感谢任何帮助和建议?谢谢!

4

1 回答 1

3

您包含在其中的代码config.before(:each) do将在每次测试之前执行 - 不会更早。但是,您的初始化程序代码将在执行任何测试用例之前执行一次。

这意味着Hominid::API存储的实例MAILCHIMP不受存根指令的影响Hominid::API.new-它仍然可以正常工作。

你也应该把存根放在上面MAILCHIMP

config.before(:each) do
  allow_any_instance_of(Hominid::API).to receive(:list_subscribe).and_return(true)
  allow(MAILCHIMP).to receive(:list_subscribe).and_return(true)
end
于 2016-05-29T14:39:18.847 回答