尝试使用RSpec模拟API类

时间:2014-04-24 02:57:16

标签: ruby-on-rails ruby rspec

我正在尝试学习如何使用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

1 个答案:

答案 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