J'ai une application qui utilise des sous-domaines pour changer de base de données (multi-tenancy). J'essaie d'utiliser Capybara pour les tests d'intégration, et cela dépend beaucoup des sous-domaines.
J'ai cru comprendre qu'en définissant Capybara.default_Host=
Sur quelque chose, toutes mes demandes proviendraient de cet hôte. Cela ne semble pas être le cas. Dans cet article , l'auteur recommande de simplement visiter l'URL explicite avec un hôte, mais cela devient un peu ennuyeux si je navigue partout. Je voudrais simplement définir l'hôte, puis pouvoir utiliser mes chemins Rails comme prévu. Je ne sais pas ce que je fais mal, mais voici ce que j'ai essayé:
# spec_helper.rb
RSpec.configure do |config|
config.before(:each, :type => :request) do
Capybara.default_Host = 'http://app.mydomain.com'
end
end
# in some_integration_spec.rb
before do
puts "Capybara.default_Host: #{Capybara.default_Host}"
puts "some_app_url: #{some_app_url}"
end
Cela donne la sortie:
Capybara.default_Host: http://app.mydomain.com
some_app_url: http://www.example.com/some_path
Qu'est-ce que je fais mal? default_Host
Semble ne rien faire. Comme je l'ai dit, je ne veux pas avoir à dire visit(Capybara.default_Host + some_app_path)
car c'est un peu ennuyeux à chaque fois. Sinon, pourquoi cette option default_Host existe-t-elle?
Je ne suis pas sûr de l'utilisation prévue de default_Host
, mais app_Host
fait ce dont vous avez besoin. J'ai découvert que je devais d'abord appeler la méthode de session Rails Host!
afin de définir la chaîne Host qui sera passée aux contrôleurs dans l'objet de requête.
Ensuite, vous devez définir Capybara.app_Host
pour dire à Capybara d'appeler votre application via le serveur Web au lieu de simplement passer les appels en cours. Si vous ne le faites pas, Capybara disparaît lorsqu'il rencontre des redirections et supprime les informations de l'hôte dans la deuxième demande.
Je ne sais pas pourquoi cela ne s'occupe pas de la fin des choses Rails request
automatiquement, mais je l'ai trouvé à moins que je ne place l'hôte aux deux endroits explicitement , alors j'obtiens des résultats incohérents.
def set_Host (Host)
Host! Host
Capybara.app_Host = "http://" + Host
end
before(:each) do
set_Host "lvh.me:3000"
end
Ensuite, vous pouvez simplement utiliser des chemins relatifs pour accéder aux pages.
Mise à jour:
Capybara 2.x et rspec-Rails 2.12. a introduit les spécifications "Fonctionnalité" pour l'exécution des tests d'acceptation Capybara. Le nouveau module FeatureExampleGroup
dans rspec-Rails
est différent de RequestExampleGroup
et n'a plus accès au test de rack Host!
méthode. Vous voulez maintenant utiliser default_url_options
au lieu:
def set_Host (Host)
# Host! Host
default_url_options[:Host] = Host
Capybara.app_Host = "http://" + Host
end
Lorsque vous devez modifier l'URL pour inclure le sous-domaine, vous pouvez spécifier le app_Host
dans vos définitions d'étape. Utilisez un domaine comme lvh.me
car il pointe vers 127.0.0.1
:
Capybara.app_Host = "http://#{subdomain}.lvh.me"
Capybara suppose que lorsque vous spécifiez un app_Host
que vous testez un serveur distant fonctionnant sur le port 80, mais dans notre cas, nous testons une application locale qui s'exécute sur un port aléatoire spécifié par Capybara. Pour résoudre ce problème, dans votre env.rb
fichier, ajoutez cette ligne:
Capybara.always_include_port = true
Maintenant, lorsque vous visitez une page de votre application ...
visit '/page'
... l'url spécifiera le sous-domaine ainsi que le port sur lequel l'application s'exécute.
FYI: Cela a fonctionné pour moi en utilisant Capybara 2.0.2.
Ce gars a la bonne réponse ici:
http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M
Vous voulez faire
Capybara.current_session.driver.reset!
Capybara.default_Host = 'http://app.mydomain.com'
au:
capybara-webkit (1.3.0)
Capybara.server_Host = "example.com"
Capybara.server_port = 3050
Capybara.run_server = true
Capybara.javascript_driver = :webkit #requires capybara-webkit
Ce n'est pas exactement la même situation que vous, mais cela pourrait aider certaines personnes:
Pour mon projet actuel, j'utilise pow avec de nombreux sous-domaines. La suite de tests doit également s'exécuter sur un port différent.
La solution dépend de la version de capybara que vous utilisez.
Pour la dernière version actuelle, je mets ceci dans custom_env.rb:
Capybara.server_Host = 'myapp.dev'
Capybara.server_port = 9887
Capybara.run_server = true
# I don't remember what this was for. Another team member wrote this part...
module ActionDispatch
module Integration #:nodoc:
class Session
def Host
[Capybara.server_Host, Capybara.server_port].join(':')
end
end
end
end
Avec capybara 1.1.2, j'avais dû faire le changement ci-dessus mais server_Host
devient app_Host
ET modifiez lib/capybara/server.rb dans la gemme comme ceci:
def url(path)
..
if path =~ /^http/
path
else
# Was this (Capybara.app_Host || "http://#{Host}:#{port}") + path.to_s
(Capybara.app_Host || "http://#{Host}") + ":#{port}" + path.to_s
end
end