2017-12-24 40 views
0

WebMockとプロキシ(Sinatra)でCapybaraを使用してリモートアプリケーションをテストしています。 私はリクエストをスタブしていませんが、WebMockを使用して要求をアサートしています。私はcapybara.appにプロキシを割り当て、クロームドライバに追加して、リクエストをプロキシに転送します。Capybaraを使用して「wait_for_pending_requests」を無効にする方法

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

私はこのエラーを無効にする方法を疑問に思う:

私の問題は、時々、私は次のようなエラーが発生します要求を保留しているということでしょうか? (とにかく試験の継続を阻止する) またどのように私は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は、AUT(テスト中のアプリケーション)を対象としています。終了するように指示されてから60秒を超えてハングするリクエストは間違いです。あなたのプロキシはあなたの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 
関連する問題