如何使用rspec-mock存根第三方对象?

时间:2016-05-29 04:47:18

标签: ruby-on-rails rspec mailchimp rspec-mocks

我是rspec-mock的新手,现在我正在整合hominid与Mailchimp进行通信,我想要存根一些方法调用,所以我的请求实际上并不是去Mailchimp。这就是我正在做的事情

配置/ initilizers / mailchimp.rb

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

user.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都会调用MAILCHIMP,现在我不希望list_subscribe在每次测试中都被调用,因为{{1}到处使用,所以我全局配置这样的存根:

spec / spec_helper.rb

User

我预计RSpec.configure do |config| config.before(:each) do allow_any_instance_of(Hominid::API).to receive(:list_subscribe).and_return(true) end end 实例不会调用MAILCHIMP但只返回list_subscribe,因为如果调用了true,一些意外的请求将转到Mailchimp,我想要防止这种情况但我上面的代码不起作用,我错了什么?如何解决这个问题?

此外,答案很可能类似于我的案例How should I stub a method globally using RSpec?

我感谢任何帮助&amp;建议?谢谢!

1 个答案:

答案 0 :(得分: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