如何使用 webmock 伪造对 Capybara/poltergeist 的响应?
How can I fake a response to Capybara/poltergeist using webmock?
我正在测试一个网络爬虫,我想使用 Webmock 来提供假网站以加快测试速度。当我模拟一个网站时,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 之外的其他 API。
提前致谢:)
Capybara 不发出 Web 请求,它告诉浏览器访问哪里,然后浏览器依次发出请求。做你想做的事情的方法是使用可以将特定浏览器请求重定向到你自己的应用程序的代理
Tom Walpole 是正确的。您可以使用 WebMock 来模拟您的服务器连接到的东西,但浏览器会建立自己的连接并且不受您对服务器所做更改的影响。
如果您想伪造浏览器从其他服务器请求的响应,请尝试 Puffing Billy。查看可以设置为重播结果的缓存功能(很像 VCR)。
如果您正在处理非常简单的事情,您可以尝试使用 Capybara.string 加载您需要的数据。但这对于您想要的可能太有限了。
我正在测试一个网络爬虫,我想使用 Webmock 来提供假网站以加快测试速度。当我模拟一个网站时,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 之外的其他 API。
提前致谢:)
Capybara 不发出 Web 请求,它告诉浏览器访问哪里,然后浏览器依次发出请求。做你想做的事情的方法是使用可以将特定浏览器请求重定向到你自己的应用程序的代理
Tom Walpole 是正确的。您可以使用 WebMock 来模拟您的服务器连接到的东西,但浏览器会建立自己的连接并且不受您对服务器所做更改的影响。
如果您想伪造浏览器从其他服务器请求的响应,请尝试 Puffing Billy。查看可以设置为重播结果的缓存功能(很像 VCR)。
如果您正在处理非常简单的事情,您可以尝试使用 Capybara.string 加载您需要的数据。但这对于您想要的可能太有限了。