我正在尝试存根我的测试套件中的任何外部API调用,但之前的(:suite)从未执行webmock总是报告我需要在maps.googleapis.com上存根,即使还没有运行任何测试(没有绿点,没有红色fs)。
规范助手.rb:

require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)

...

config.before(:suite) do
    puts "THIS NEVER SHOWS"
    stub_request(:get, "maps.googleapis.com").
      with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
      to_return(status: 200, body: "", headers: {})
end

geocoder gem最终试图从googleapis.com保存lat/lon,Webmock错误地指出URL未注册。
编辑:错误代码段:
$ bundle exec rspec spec/factories_spec.rb
/home/jake/.rvm/gems/ruby-2.1.0@global/gems/webmock-1.17.4/lib/webmock/http_lib_adapters/net_http.rb:114:in `request': Real HTTP connections are disabled. Unregistered request: GET http://maps.googleapis.com/maps/api/geocode/json?address=[private]&language=en&sensor=false with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'} (WebMock::NetConnectNotAllowedError)

You can stub this request with the following snippet:

stub_request(:get, "http://maps.googleapis.com/maps/api/geocode/json?address=[private]&language=en&sensor=false").
  with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
  to_return(:status => 200, :body => "", :headers => {})

============================================================
    from /home/jake/.rvm/gems/ruby-2.1.0@global/gems/geocoder-1.1.9...

    ...

再次强调,这与config.before(:each)块中的代码从未运行有关为什么?因为如果是的话,我可以“raise'wtf'”,并且“wtf”应该出现在控制台输出中,而不是出现上面看到的错误。我只在“解包”webmock gem时看到“wtf”。

最佳答案

我对rspec测试做了些“可爱的事情”,根据工厂是否有文件属性,在运行时创建测试。由于我的工厂/模型的设置方式,当读取某个工厂的属性时创建(保存)工厂,因此生成测试的代码块在RSpec的config.before(:suite)和WebMock之外运行会引发错误。
https://github.com/bblimke/webmock/issues/378
此外,以下是我做错的地方——与webmock无关:
1)在我的FrimeReal.RB中,我调用了CyAuter()来关联可能还不存在的关联。为什么?因为rspec给我的错误是“关联是空白的”。这是因为我已经验证了association的存在,而不是仅仅验证了association。当我使用create()而不是build()时,它“工作了”当然,到了使用webmock的时候,我正在创建(并因此保存)调用geocoder的对象来完成它的任务。解决方案是在我的工厂中修复validates_presence_of以使用正确的属性并使用build()而不是create()。
坏例子:

# In spec/factories.rb
factory :review, class: Manager::Review do
    rating 4
    wine { Manager::Wine.first || create(:wine) }
    reviewer { Manager::Reviewer.first || create(:reviewer) }
    date Time.now
    association :referral, referrable_id: 1, referrable_type: Manager::Review, strategy: :build
end

# In app/models/manager/review.rb
validates_presence_of :rating_id, :wine_id, :reviewer_id, :date

好例子:
# In spec/factories.rb
factory :review, class: Manager::Review do
    rating 4
    wine { Manager::Wine.first || build(:wine) }
    reviewer { Manager::Reviewer.first || build(:reviewer) }
    date Time.now
    association :referral, referrable_id: 1, referrable_type: Manager::Review, strategy: :build
end

# In app/models/manager/review.rb
validates_presence_of :rating, :wine, :reviewer, :date

2)FWIW,我告诉geocoder在保存之前获取geocode,而不是像他们主页上建议的那样在验证之后。
另外,不能在before(:suite)中使用WebMock存根,但它在before(:each)中工作

关于ruby-on-rails - 套件未运行之前的RSpec,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22585469/

10-16 23:07