Selenium AND/OR capybara-webkitドライバーと Webmock をスタブ フレームワークとして使用してCapybaraを使用しています。
Selenium (firefox) を使用して Google マップ (場所) オートコンプリート入力の統合テストを実行すると、ブラウザーは Google に対していくつかの実際の呼び出しを行い、場所コンポーネントを含む JSON を受け取ります。
同じことをするために capybara-webkit ドライバー (muuuuch より高速) に変更すると、外部要求をスタブする必要があるという webmock メッセージが表示されます。
なぜこの2つに違いがあるのか 誰かが私に説明してもらえますか?
注:WebMock.disable_net_connect!( :allow_localhost => true )
ローカルサーバーへの呼び出しを許可するように設定しました...
編集:
WebMock のようなツールは優れていますが、JavaScript をテストする場合、ページをロードするのは別のブラウザー プロセスであり、Ruby テスト プロセスではありません。これは、ビルド サーバーへの要求が Net::HTTP を経由しないことを意味します。リクエストは Firefox または capybara-webkit からのものであり、これらのツールは、HTTP トラフィックを再ルーティングしようとするあなたのわずかな試みを喜んで認識しません。
http://robots.thoughtbot.com/using-capybara-to-test-javascript-that-makes-httpからの引用
これは、支払いシステムへの呼び出し (Rails コントローラーで行われる) をスタブ化する必要がある理由と ajax がスタブ化しない理由を説明していますが、Firefox が Google に到達し、webkit がスタブを要求する理由を説明していません。
解決:
TL;DR; :seleniumを保持し、外部APIへのajax呼び出しを行う必要があるテストで実際の呼び出しを行います
JS/ブラウザの外部呼び出しに使う puffing-billy でモックしてみましたが、これは Webmock と「うまく連携」しません。また、支払いシステム用の 25 のスタブが既に Webmock で書かれているので、切り替えることはできません...
記録フレームワークであるVRCも試しましたが、これもアプリケーションからの呼び出し用です(Ruby NETライブラリ)
最終的に、Firefox を起動して gMaps を実際に呼び出す :selenium ドライバーを使用して、ajax API 応答を必要とするこれらのいくつかのテストを実行し続けることにしました。
#spec_helper
...
WebMock.disable_net_connect!( :allow_localhost => true ) # Ask to stub all requests except to localhost
...
# Use headless capybara-webkit that is way faster!
Capybara.javascript_driver = :webkit
config.before(:each, js: true) do
...
end
# And when you need :selenium and firefox mark the spec with :force_selenium => true
config.before(:each, force_selenium: true) do
Capybara.current_driver = :selenium
end