tests run rails how ruby-on-rails rspec

ruby on rails - run - ¿Cómo cambio el dominio predeterminado "www.example.com" para probar en rieles?



rspec rails (10)

Creo que puede modificar los HTTP_HOST entorno HTTP_HOST o SERVER_NAME para cambiar la solicitud que va al enrutador:

ENV[''SERVER_NAME''] = "user.myapp.com"

Ver raw_host_with_port en actionpack/lib/action_controller/request.rb .

Tengo una aplicación de rieles que actúa de manera diferente según el dominio al que se acceda (por ejemplo, www.myapp.com invocará de manera diferente a user.myapp.com). En producción, todo esto funciona bien, pero mi código de prueba siempre ve un nombre de host de "www.example.com".

¿Hay una forma clara de tener una prueba para especificar el nombre de host al que pretende acceder?


Creo que todas las respuestas están incompletas aquí ... Para enumerar todos los casos posibles:

  • Integration Specs (hereda de ActionDispatch::IntegrationTest ):

    host! "my.awesome.host"

    Consulte los docs , sección 5.1 Ayudantes disponibles para las pruebas de integración .

  • Especificaciones del controlador ( ActionController::TestCase de ActionController::TestCase )

    @request.host = ''my.awesome.host''

    Ver los docs , sección 4.4 Variables de instancia disponibles .

  • Características de la característica (a través de Capybara)

    Capybara.default_host = "http://my.awesome.host" # Or to configure domain for route helpers: default_url_options[:host] = "my.awesome.host"

    De la respuesta de @AminAriana

  • Ver especificaciones ( ActionView::TestCase de ActionView::TestCase )

    @request.host = ''my.awesome.host''

    ... o a través de RSpec:

    controller.request.host = "my.awesome.host"

    Consulte los documentos de especificaciones de la vista rspec-rails .


En características, ¡host! ha sido desaprobado. Añádalos a su rspec_helper.rb:

# Configure Capybara expected host Capybara.app_host = <myhost> # Configure actual routes host during test before(:each) do default_url_options[:host] = <myhost> end


Ninguna de las formas sugeridas en otras respuestas en el punto funcionó para mí. Esto funcionó:

Capybara.configure { |config| config.default_host = "my.domain.com" }


Otra cosa para recordar es asegurarse de usar la instancia de sesión correcta para que pueda encapsular correctamente los helpers de url.

Las pruebas de integración le proporcionan una sesión predeterminada. Puede llamar a todos los métodos de sesión directamente desde sus pruebas

test "should integrate well" do https! get users_path assert_response :success end

Todos estos ayudantes están utilizando la instancia de sesión predeterminada, que si no se cambia, va a "www.example.com". Como se mencionó, el host se puede cambiar haciendo host! ("My.new.host")

Si crea varias sesiones utilizando el método open_session, SIEMPRE debe usar esa instancia para llamar a los métodos auxiliares. Esto encapsulará adecuadamente la solicitud. De lo contrario, los rieles llamarán a la instancia de sesión predeterminada que puede usar un host diferente:

test "should integrate well" do sess = open_session sess.host! "my.awesome.host" sess.get users_url #=> WRONG! will use default session object to build url. sess.get sess.users_url #=> Correctly invoking url writer from my custom session with new host. sess.assert_response :success end

Si pretendía utilizar el objeto de sesión predeterminado, entonces deberá modificar ese host también:

test "should integrate well" do sess = open_session sess.host! "my.awesome.host" host! sess.host #=> Set default session host to my custom session host. sess.get users_url end


Otra respuesta más:

request.host = "user.myapp.com"

Sé que se parece a la respuesta correcta, pero por favor tengan paciencia conmigo. No me gusta la operación de asignación en la prueba solo para configurar cosas, prefiero un stub explícito. Curiosamente, un trozo como este no funcionará:

allow(request).to receive(:host).and_return("user.myapp.com")

Personalmente prefiero tropezar con asignación, de esa manera obtengo 2 beneficios, uno es que será validado por el doble de verificación de rspec , segundo es que está diciendo explícitamente que es un apéndice, no parte del ejercicio de prueba.



Probé muchas variaciones de @request.host , host! y post path, args, {''SERVER_NAME'' => my_secret_domain} sin éxito, como pruebas de controlador y pruebas de características. Muy irritante, ya que muchos otros reportaron el éxito con esos enfoques.

La solución para mí fue:

request.headers["SERVER_NAME"] = my_secret_domain post path, args

Estoy ejecutando ruby ​​2.1.5p273, rspec 3.1.7 y Rails 4.2.0


@request.host = ''user.myapp.com'' no es correcto. debería usar host!(''user.myapp.com'')


@request.host = ''user.myapp.com''