6

Estoy mono parcheando Capybara :: Sesión con un método set_headers que asigna a Capybara :: RackTest :: atributo de opciones del navegador (que he cambiado de un attr_reader a un attr_accessor).¿Cuál es la mejor manera de establecer encabezados de solicitud personalizados cuando se usa Capybara en las especificaciones de solicitud de RSpec?

Los parches:

class Capybara::RackTest::Browser 
    attr_accessor :options 
end 

class Capybara::Session 
    def set_headers(headers) 
    if driver.browser.respond_to?(:options=) #because we've monkey patched it above 
     options = driver.browser.options 
     if options.nil? || options[:headers].nil? 
     options ||= {} 
     options[:headers] = headers 
     else 
     options[:headers].merge!(headers) 
     end 
    else 
     raise Capybara::NotSupportedByDriverError 
    end 
    end 
end 

En mi especificación solicitud, que estoy haciendo:

page.set_headers("REMOTE_ADDR" => "1.2.3.4") 
visit root_path 

Esto funciona, pero me pregunto si hay una manera mejor, parece un poco exagerado para poder establecer un remote_ip/remote_addr personalizado en una solicitud. ¿Alguna idea?

Respuesta

1

si desea que los encabezados que se establezcan a nivel mundial en todas las solicitudes, se puede usar algo como:

Capybara.register_driver :custom_headers_driver do |app| 
    Capybara::RackTest::Driver.new(app, :headers => {'HTTP_FOO' => 'foobar'}) 
end 

Ver el rack_test_driver_spec.rb en Carpincho 1.1.2 y emisión de Carpincho # 320, Setting up HTTP headers.

1

¿Necesita agregar encabezado personalizado en una solicitud específica en rspec utilizando capybara? Usé esto en pruebas de aceptación. Era la mejor manera para mí de usar el método get con datos de encabezado específicos. Puede evaluar un elemento específico en la página de respuesta. Ver mi ejemplo a continuación:

get user_registration_path, { :invite => invite_token }, { 'X_GEOIP_COUNTRY_CODE' => 'US' } 
expect(assigns(:ip_country)).to eq('US') 
response.body.should have_selector("input#currency_usd[checked='checked']") 

Espero que ayude.

Cuestiones relacionadas