如何使用webmock伪装对Capybara / poltergeist的回复?

时间:2015-08-13 19:50:21

标签: ruby phantomjs capybara poltergeist webmock

我正在测试网络浏览器,我想使用Webmock提供虚假网站以加快测试速度。当我模拟一个网站时,Ruby的原生HTTP库工作正常,但Capybara似乎无法接收模拟的响应。我知道webmock正在拦截低级别的HTTP请求,我认为一个capybara使用哪个以及哪个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。

提前致谢:)

2 个答案:

答案 0 :(得分:4)

汤姆沃波尔是对的。您可以使用WebMock模拟服务器连接的内容,但浏览器会建立自己的连接,并且不受您对服务器所做更改的影响。

如果您想伪造浏览器从其他服务器请求的响应,请尝试Puffing Billy之类的内容。看看缓存功能,可以设置重新播放结果(很像VCR)。

如果您正在处理非常简单的事情,可以尝试使用Capybara.string加载所需的数据。但这可能对你想要的东西太有限了。

答案 1 :(得分:1)

Capybara不会发出网络请求,它告诉浏览器访问的位置,浏览器依次发出请求。实现您想要的方法是使用可以将特定浏览器请求重定向到您自己的应用程序的代理