我是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;建议?谢谢!
答案 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