テスト スイートで外部 API 呼び出しをスタブしようとしていますが、before(:suite) が実行されません。Webmock は、テストがまだ実行されていない場合でも、maps.googleapis.com をスタブ化する必要があることを常に報告します (緑色の点も赤色の F もありません)。
spec_helper.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
ジオコーダー gem は googleapis.com から緯度/経度を保存しようとし、URL が登録されていないことを示すエラーが Webmock によって発生します。
編集: エラー スニペット:
$ 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) ブロック内のコードが実行されないという事実に関係していることを強調します。なんで?もしそうなら、「'WTF' を上げる」ことができ、上記のエラーの代わりに 'WTF' がコンソール出力に表示されるはずです。Webmock gem を「バンドル解除」したときにのみ「WTF」が表示されます。