2009-03-01 12 views
39

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".¿Cómo cambio el dominio predeterminado "www.example.com" para probar en rieles?

¿Existe alguna forma clara de realizar una prueba para especificar el nombre de host al que pretende acceder?

Respuesta

23
@request.host = 'user.myapp.com' 
+17

'host! 'user.myapp.com'' funcionó para mí – deb

+2

En una especificación de controlador, aparece un error al tratar de usar 'host!'. Sin embargo, establecer '@ request.host' como la respuesta sugiere que funcionó. –

+6

¿Y cómo lo uso con RSpec? Quiero decir, ¿dónde lo configuro? ¡muchas gracias! – FRAGA

4

Creo que se puede modificar el entorno HTTP_HOST o SERVER_NAME vars para cambiar la solicitud que va al router:

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

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

1

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

+2

Esta sintaxis no funcionó para mí. Tampoco la respuesta aceptada. ¡Lo único que funcionaba como host! ('Newhostname.com'). – jeffarena

+1

Por supuesto, debe poner la cadena del nombre de host en comillas simples o dobles. – justingordon

2

Otra cosa a recordar es asegurarse de utilizar la instancia correcta sesión para que pueda encapsular adecuadamente los ayudantes de URL.

Las pruebas de integración le proporcionan una sesión predeterminada. Puede llamar all session methods directamente de 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 predeterminado, que si no se cambia, va a "www.example.com". Como se ha mencionado, 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 rieles llamarán a la instancia de sesión predeterminado que puede utilizar 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 usted pretende utilizar el objeto de sesión predeterminado, entonces tendrá que alterar esa acogida, así:

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 
9

¡En características, host! ha sido desaprobado. Añadir estos 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 
+0

Nota: Parece que 'Capybara.app_host' necesita incluir el protocolo. P.ej. '" http: //test.domain "' en lugar de simplemente '" test.domain "'. – lime

+1

cómo incluir el puerto? –

53

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

  • Integración Especificaciones (heredando de ActionDispatch::IntegrationTest):

    host! "my.awesome.host" 
    

    Ver el docs, sección 5.1 Ayudantes disponibles para pruebas de integración.

  • Controlador Especificaciones de (heredando de ActionController::TestCase)

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

    Véase el docs, sección 4.4 Variables de instancia disponibles.

  • Especificaciones Función (a través de capibara)

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

    De @AminAriana's answer

  • Ver especificaciones (heredando de ActionView::TestCase)

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

    ... oa través de RSpec:

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

    Véase el rspec-railsview spec docs.

+0

Gracias a los rieles 5 y el cambio de 'ActionController :: TestCase' a' ActionDispatch :: IntegrationTest', esta parte superior 'Integration Specs' es muy valiosa para aquellos de nosotros con aplicaciones legacy multi-tennant.Esta fue la primera respuesta que mostró cómo convertir '@ request.host' fácilmente en una suite anterior (usando' host! '). Leyendo los documentos esto no me saltó pero aquí estamos, ¡y gracias! – pjammer

1

I intentado muchas variaciones de @request.host, host!, y post path, args, {'SERVER_NAME' => my_secret_domain} sin éxito, tanto como las pruebas de controlador y pruebas de función. 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 corriendo rubí 2.1.5p273, rspec 3.1.7 y 4.2.0 Carriles

0

Sin embargo, otra respuesta:

request.host = "user.myapp.com" 

Sé que se parece a la respuesta correcta, pero por favor desnudo conmigo. No me gusta la operación de asignación en la prueba solo para configurar cosas, prefiero un stub explícito. Curiosamente, stubbing como esto voluntad no trabajo:

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

yo personalmente prefiero que tropieza sobre la asignación, de esa manera me sale 2 beneficio, una es que será validada por de rspec verificar doble, segundo es que está diciendo explícitamente que es un stub, no es parte del ejercicio de prueba.

0

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" } 
Cuestiones relacionadas