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
deActionController::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
deActionView::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.
Para las especificaciones de solicitud de Rspec, use before(:each) { host! ''example.com'' }
before(:each) { host! ''example.com'' }
Ver más en: https://relishapp.com/rspec/rspec-rails/v/3-6/docs/request-specs/request-spec https://github.com/rspec/rspec-rails/issues/1662#issuecomment-241201056
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''