2017-12-24 4 views
0

Ich verwende Capybara mit WebMock und einen Proxy (Sinatra), um eine Remote-App zu testen. Ich stemple nicht die Anfragen, sondern benutze WebMock, um Anfragen zu bestätigen. Ich habe den Proxy capybara.app zugewiesen und dem Chrome-Treiber hinzugefügt, damit die Anfragen an den Proxy weitergeleitet werden.Verwenden von Capybara zum Deaktivieren von "wait_for_pending_requests", da es einen Fehler verursacht

Mein Problem ist, dass ich anstehende Anforderungen manchmal die die folgenden Fehler erhöhen:

Failure/Error: raise "Requests did not finish in 60 seconds" 

Ich frage mich, wie kann ich diesen Fehler zu deaktivieren? auch Wie kann ich die hart codierte Timeout ändern, die 60 ist (was die Fortsetzung des Tests ohnehin blockiert)

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 

Sinatra proxy:

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 

Antwort

0

Sie können das Zeitlimit für das Warten während des Zurücksetzens nicht ändern, Sie sollten jedoch Capybara.app nicht auf Ihre Proxy-App setzen, um damit zu beginnen. Capybara.app ist für Ihre AUT (Anwendung im Test) gedacht, bei der alle Anfragen, die länger als 60 Sekunden nach dem Beenden des Programms hängen bleiben, definitiv ein Fehler sind. Da Ihr Proxy nicht Ihr AUT ist, führen Sie es einfach separat aus und sagen Sie Capybara, dass Sie keinen Server/App ausführen sollen.

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 
Verwandte Themen