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
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.
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
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
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