我正在尝试学习如何使用RSpec来测试API类实例正在调用我的create类的create_price_type_cache方法。我已经尝试了一些我用Google搜索过的方法,但是我知道如何做到这一点,或者即使我应该以不同的方式编写API类。
下面的测试给出了错误:
undefined method `api_endpoint' for #<Rails::Application::Configuration:0x00000107376420>
# setting_spec.rb
it "should call get_price_type_list from the API" do
price_types = [build(:price_type)]
api = mock_model(Api.instance)
api.stub!(:get_price_type_list).and_return(price_types)
expect(Api.instance.should_recieve(:get_price_type_list).and_return(api)).to eq [price_types]
end
# setting.rb
class Setting
def self.create_price_type_cache
array = Api.instance.get_price_type_list
ActiveRecord::Base.transaction do
CachePriceType.delete_all
array.each do |e|
e.save!
end
end
end
end
# api.rb
class Api
def self.instance
@instance ||= new
end
def get_price_type_list
# Makes an API call and returns an array of objects
end
end
感谢。
修改
谢谢jstim唤醒我,看了这么久后我迷惑了自己。我已经删除了我的Api类的配置设置,这似乎有效,但这是最好的方法,或者我应该像我最初尝试一样模拟Api类?
这是我目前的通过测试:
Rails.application.config.stub(:api_endpoint).and_return("")
price_types = [build(:cache_price_type)]
Api.instance.stub(:get_price_type_list).and_return([price_types])
Array.any_instance.stub(:save!)
expect {Setting.create_price_type_cache}.to_not raise_error
答案 0 :(得分:0)
我仍然不确定这是否是最佳方法,因为我必须在我的Api类中存根每个配置设置,但这是我最终用作现在的最终测试:
Rails.application.config.stub(:api_endpoint).and_return("")
price_types = [build(:cache_price_type)]
Api.instance.stub(:get_price_type_list).and_return([price_types])
Array.any_instance.stub(:save!)
expect {Setting.create_price_type_cache}.to_not raise_error