2010-03-31 20 views
51

Estoy usando rSpec para probar mi aplicación. En mi controlador de aplicación tengo un método de este modo:Rails rspec set subdominio

def set_current_account 
    @current_account ||= Account.find_by_subdomain(request.subdomains.first) 
end 

¿Es posible establecer el request.subdomain en mi especificación? Tal vez en el bloque anterior? Soy nuevo en rSpec, así que cualquier consejo sobre esto sería genial, gracias.

Eef

Respuesta

83

me di cuenta de cómo ordenar este tema.

En mi cuadra antes en las especificaciones de mi Simplemente añade:

before(:each) do 
    @request.host = "#{mock_subdomain}.example.com" 
end 

Este configuraciones de la request.subdomains.first a ser el valor de la mock_subdomain.

Espero que alguien lo encuentre útil ya que no se explica muy bien en ningún otro lugar en la red.

+9

one small tip - request is availab le como un método así como una variable de instancia. Probablemente sea mejor acceder a él a través del método, para mantener una pequeña distancia entre usted y el código RSpec subyacente. – pat

+0

¿Puedo preguntar cómo se hace el método? – lulalala

+5

@lulalala 'request.host =" # {mock_subdomain} .example.com "' – alf

8

En rieles 3 todo lo que intenté configurar manualmente para el host no funcionó, pero mirando el código noté lo bien que analizaron la ruta que pasas a los helpers de solicitud como get. Efectivamente si el controlador va y obtiene el usuario mencionado en el subdominio y lo almacena como @king_of_the_castle

it "fetches the user of the subomain" do 
    get "http://#{mock_subdomain}.example.com/rest_of_the_path" 
    assigns[:king_of_the_castle].should eql(User.find_by_name mock_subdomain) 
end 
+0

Si esta es o no la forma oficial de hacerlo en Rails 3, agregando el host directamente a la ruta como lo demostró ilpoldo funcionó para mí. –

+0

Esto no funciona en las especificaciones de los controladores. No puedes hacer la ruta 'get '' '. Interpretará eso como la acción. Debes hacer 'get: action_name' solo por alguna razón. – darksky

+1

Sí, el de arriba es un fragmento de una especificación de solicitud. – ilpoldo

29

Sé que esto es una cuestión relativamente antiguo, pero me he dado cuenta que esto depende del tipo de prueba que esta corriendo También estoy ejecutando Rails 4 y RSpec 3.2, así que estoy seguro de que algunas cosas han cambiado desde que se hizo esta pregunta.

Solicitar Especificaciones

before { host! "#{mock_subdomain}.example.com" } 

Especificaciones de función con Carpincho

before { Capybara.default_host = "http://#{mock_subdomain}.example.com" } 
after { Capybara.default_host = "http://www.example.com" } 

Por lo general crear módulos en spec/support que miran algo como esto:

# spec/support/feature_subdomain_helpers.rb 
module FeatureSubdomainHelpers 
    # Sets Capybara to use a given subdomain. 
    def within_subdomain(subdomain) 
    before { Capybara.default_host = "http://#{subdomain}.example.com" } 
    after { Capybara.default_host = "http://www.example.com" } 
    yield 
    end 
end 

# spec/support/request_subdomain_helpers.rb 
module RequestSubdomainHelpers 
    # Sets host to use a given subdomain. 
    def within_subdomain(subdomain) 
    before { host! "#{subdomain}.example.com" } 
    after { host! "www.example.com" } 
    yield 
    end 
end 

Incluir en spec/rails_helper.rb:

RSpec.configure do |config| 
    # ... 

    # Extensions 
    config.extend FeatureSubdomainHelpers, type: :feature 
    config.extend RequestSubdomainHelpers, type: :request 
end 

A continuación, puede llamar dentro de su especificación de este modo:

feature 'Admin signs in' do 
    given!(:admin) { FactoryGirl.create(:user, :admin) } 

    within_subdomain :admin do 
    scenario 'with valid credentials' do 
     # ... 
    end 

    scenario 'with invalid password' do 
     # ... 
    end 
    end 
end 
+0

¡Usted, señor, gracias! –

0
  • Rspec - 3.6.0
  • Carpincho - 2.15.1
respuesta

Chris Peters trabajado para mí para la solicitud de especificaciones, pero para las especificaciones de características, que tenía que realizar los siguientes cambios:

rails_helper:

Capybara.app_host = 'http://lvh.me' 
Capybara.always_include_port = true 

feature_subdomain_helpers:

module FeatureSubdomainHelpers 
    def within_subdomain(subdomain) 
     before { Capybara.app_host = "http://#{subdomain}.lvh.me" } 
     after { Capybara.app_host = "http://lvh.me" } 
     yield 
    end 
end 
Cuestiones relacionadas