57 votes

Rails rspec set subdomain

J'utilise rSpec pour tester mon application. Dans le contrôleur de mon application, j'ai une méthode comme celle-ci :

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

Est-il possible de définir le sous-domaine request.subdomain dans ma spécification ? Peut-être dans le bloc before ? Je suis novice en matière de rSpec, donc tout conseil à ce sujet serait le bienvenu, merci.

Eef

88voto

RailsSon Points 3944

J'ai trouvé comment résoudre ce problème.

Dans mon bloc avant, dans mes spécifications, j'ai simplement ajouté :

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

Cela configure le request.subdomains.first pour être la valeur du mock_subdomain.

J'espère que quelqu'un trouvera cela utile, car ce n'est pas très bien expliqué ailleurs sur le net.

56voto

Chris Peters Points 6429

Je sais que c'est une question relativement ancienne, mais j'ai constaté que cela dépend du type de test que vous exécutez. J'utilise également Rails 4 et RSpec 3.2, donc je suis sûr que certaines choses ont changé depuis que cette question a été posée.

Demande de spécifications

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

Spécifications des fonctionnalités avec Capybara

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

Je crée généralement des modules dans spec/support qui ressemblent à quelque chose comme ça :

# 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

Inclure dans spec/rails_helper.rb :

RSpec.configure do |config|
  # ...

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

Ensuite, vous pouvez appeler dans votre spécification comme ceci :

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

8voto

ilpoldo Points 416

Dans rails 3, tout ce que j'ai essayé pour définir manuellement l'hôte n'a pas fonctionné, mais en regardant le code, j'ai remarqué qu'ils analysent très bien le chemin que vous passez aux aides à la requête comme get . Bien sûr, si votre contrôleur va chercher l'utilisateur mentionné dans le sous-domaine et le stocke en tant que @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

2voto

mridula Points 977
  • Rspec - 3.6.0
  • Capybara - 2.15.1

La réponse de Chris Peters a fonctionné pour moi pour les spécifications de demande, mais pour les spécifications de fonctionnalité, j'ai dû faire les changements suivants :

rails_helper :

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

Aide pour les sous-domaines :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X