web-dev-qa-db-fra.com

Rails rspec set sous-domaine

J'utilise rSpec pour tester mon application. Dans mon contrôleur d'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.s dans mes spécifications? Peut-être dans le bloc avant? Je suis nouveau sur rSpec, donc tout conseil à ce sujet serait un grand merci.

Eef

57
RailsSon

J'ai compris comment trier 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

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

J'espère que quelqu'un trouve cela utile car cela ne s'explique pas très bien ailleurs sur le net.

87
RailsSon

Je sais que c'est une question relativement ancienne, mais j'ai trouvé que cela dépend du type de test que vous exécutez. J'exécute é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.

Spécifications de demande

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

Caractéristiques techniques 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 ressemble à ceci:

# 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

Inclus 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 vos spécifications comme suit:

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
41
Chris Peters

Dans Rails 3 tout ce que j'ai essayé de définir manuellement l'hôte n'a pas fonctionné, mais en regardant le code, j'ai remarqué à quel point ils analysaient le chemin que vous passez aux assistants de demande comme get Effectivement, si votre contrôleur va et récupère l'utilisateur mentionné dans le sous-domaine et le stocke comme @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
8
ilpoldo
  • Rspec - 3.6.0
  • Capybara - 2.15.1

La réponse de Chris Peters a fonctionné pour moi pour les spécifications de la demande, mais pour les spécifications des fonctionnalités, j'ai dû apporter les modifications suivantes:

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
1
mridula