2017-12-24 4 views
0

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 

답변

0

재설정 중에 대기 시간 초과를 변경할 수는 없지만 시작하려면 프록시 앱에 Capybara.app을 설정하면 안됩니다. Capybara.app은 종료하라는 메시지가 표시되면 60 초 이상 지연되는 요청은 확실히 오류 인 AUT (테스트중인 응용 프로그램)을 대상으로합니다. 프록시는 AUT가 아니므로 별도로 실행하고 Capybara에게 서버/앱을 실행하지 말라고 말하십시오.

Capybara.run_server = false 

Thread.new do 
    Rack::Handler::Puma.run(SinatraProxy.new, Host: '0.0.0.0', Port: 9980) # You might need/want other options here or to use thin/webrick/etc 
end 
관련 문제