WebMock 및 프록시 (Sinatra)와 함께 Capybara를 사용하여 원격 응용 프로그램을 테스트하고 있습니다. 요청을 스텁하지 않고 WebMock을 사용하여 요청을 주장합니다. capybara.app에 프록시를 지정하고 크롬 드라이버에 추가하여 요청을 프록시에 전달합니다.Capybara를 사용하여 오류 발생시 "wait_for_pending_requests"를 비활성화하는 방법
Failure/Error: raise "Requests did not finish in 60 seconds"
내가이 오류를 해제 할 수 있습니다 궁금 :
내 문제는 다음과 같은 오류가 발생합니다 가끔 보류중인 요청이 있다는 것입니다? 또한 I는 (어쨌든 시험의 계속을 차단 함) (60)은 하드 코딩 된 제한 시간을 변경하는 방법
Timeout.timeout(60) { sleep(0.01) while @middleware.pending_requests? }
capybara.rb :
require 'capybara/rspec'
require 'capybara'
require 'capybara/dsl'
require_relative 'sinatra_proxy'
require 'selenium/webdriver'
require 'selenium/webdriver/remote/http/curb' if !isWindows
Capybara.server_port = 9980
Capybara.register_driver :selenium_chrome do |app|
http_client = isWindows ? nil : Selenium::WebDriver::Remote::Http::Curb.new
options = {
http_client: http_client,
browser: :chrome,
switches: [
"--proxy-server=0.0.0.0:9980",
"--disable-web-security",
'--user-agent="Chrome under Selenium for Capybara"',
"--start-maximized",
'--no-sandbox',
]
}
Capybara::Selenium::Driver.new app, options
end
Capybara.default_driver = :selenium_chrome
Capybara.app = SinatraProxy.new
Capybara.server_host = '0.0.0.0'
Capybara.default_max_wait_time = 8
시나 프록시 :
require "sinatra"
require 'net/http'
require 'json'
file = File.read 'config.json'
config_json = JSON.parse(file)
HOST = 'remote_app'
PORT = '80'
HEADERS_NOT_TO_PROXY = %w(transfer-encoding)
class SinatraProxy < Sinatra::Base
# configure :development do
# register Sinatra::Reloader
# end
def request_headers
request.env.select {|k,v| k.start_with? 'HTTP_'}
.collect {|pair| [pair[0].sub(/^HTTP_/, ''), pair[1]]}
.to_h # Ruby 2.1
.merge('CONTENT-TYPE' => request.env['CONTENT_TYPE'] || 'application/json')
end
proxy = lambda do
# puts "REQUEST HEADERS #{request_headers}"
uri = URI.parse(request.url)
http = Net::HTTP.new(HOST, PORT)
response = http.send_request(
request.request_method.upcase,
uri.request_uri,
request.body.read,
request_headers)
response_headers = {}
response.to_hash.each{|k,v| response_headers[k]=v.join unless HEADERS_NOT_TO_PROXY.include?(k) }
status response.code
headers response_headers
headers 'Access-Control-Allow-Origin' => '*'
# puts "RESPONSE HEADERS #{response_headers}, BODY: #{response.body}"
body response.body
end
get '/*', &proxy
post '/*', &proxy
patch '/*', &proxy
put '/*', &proxy
delete '/*', &proxy
options "*" do
headers 'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'HEAD,GET,PUT,DELETE,OPTIONS'
halt 200
end
end