3

Webscraper をテストしていますが、Webmock を使用して偽の Web サイトを配信し、テストを高速化したいと考えています。Web サイトをモックすると、Ruby のネイティブ HTTP ライブラリは正常に動作しますが、Capybara はモックされた応答を受信できないようです。Webmock が低レベルの HTTP リクエストをスタブ化していることはわかっています。どのカピバラが使用し、どの Webmock が使用するように構成されているかが重要であると思います。ただし、Capybara が HTTP リクエストを作成する方法と、その特定のメソッド セットをスタブ化するように webmock を構成する方法を知る必要があります。

require 'capybara/poltergeist'
require 'webmock'
require 'pry'
include WebMock::API
WebMock.disable_net_connect!(allow_localhost:true)


Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app, js_errors: false)
end
# Configure Capybara to use Poltergeist as the driver
Capybara.default_driver = :poltergeist
Capybara.javascript_driver = :poltergeist

U = /google.com/

b = Capybara.current_session

stub_request(:any, U).
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:"abc", headers:{})

puts Net::HTTP.get(U,'/') #=> This returns "abc"

b.visit U
puts b.html  #=> Throws error

私が得ているエラーは次のとおりです。 command': Request failed to reach server, check DNS and/or server status (Capybara::Poltergeist::StatusFailError)

FakeWeb も試してみましたが、単純に URI を登録できませんでした。Webmock が仕事に不適切なツールだと思われる場合は、webmock 以外の他の API を使用してもかまいません。

前もって感謝します :)

4

2 に答える 2

4

トム・ウォルポールは正しい。WebMock を使用して、サーバーが接続しているものをモックできますが、ブラウザーは独自の接続を作成し、サーバーに加えた変更の影響を受けません。

ブラウザが他のサーバーから要求した応答を偽造したい場合は、Puffing Billyのようなものを試してください。結果を再生するように設定できるキャッシング機能を見てみましょう (VCR のように)。

非常に単純なもので作業している場合は、必要なデータをCapybara.stringでロードするだけで試すことができます。しかし、それはおそらくあなたが望むものにはあまりにも限られています.

于 2015-08-15T18:58:37.663 に答える
1

Capybara は Web リクエストを作成しません。ブラウザにアクセス先を伝え、ブラウザがリクエストを作成します。あなたが望むことをする方法は、特定のブラウザ要求を自分のアプリにリダイレクトできるプロキシを使用することです

于 2015-08-15T13:29:37.913 に答える