47 votes

Capybara avec sous-domaines - default_host

J'ai une application qui utilise les sous-domaines pour changer de base de données (multi-tenant). Je suis en train d'utiliser le Capybara pour les tests d'intégration, et c'est vraiment s'appuie beaucoup sur des sous-domaines.

Ma compréhension était que le paramètre Capybara.default_host= de quelque chose serait de faire toutes mes demandes proviennent de cet hôte. Cela ne semble pas être le cas. Dans ce post, l'auteur recommande de visiter l'url explicite avec un hôte, mais cela devient un peu gênant si je suis la navigation de tous sur la place. Je voudrais juste mettre l'hôte, puis être en mesure d'utiliser mon rails de chemins comme prévu. Pas sûr de 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 le résultat:

Capybara.default_host: http://app.mydomain.com
some_app_url: http://www.example.com/some_path

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) que c'est un peu gênant à chaque fois. Sinon, pourquoi est-ce à default_host option existe pas?

59voto

Lachlan Cotter Points 1166

Je ne suis pas sûr de l'utilisation prévue de l' default_host, mais app_host fait ce que vous avez besoin. J'ai trouvé, j'ai d'abord besoin d'appeler les rails de la session de méthode host! afin de configurer l'hôte de la chaîne qui sera transmise aux contrôleurs dans l'objet de requête.

Ensuite, vous devez définir le Capybara.app_host dire Capybara pour appeler votre application via le serveur web au lieu de seulement faire les appels en cours. Si vous ne le faites pas alors Capybara perruques quand il rencontre les redirections et les gouttes les informations d'hôte dans la deuxième demande.

Je ne suis pas sûr de savoir pourquoi cela ne prend pas soin de les Rails request fin des choses automatiquement, mais j'ai trouvé que si je leur jeu de l'hôte dans les deux endroits, explicitement, puis-je obtenir 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 vers les pages d'accès.

Mise à jour:

Capybara 2.x et rspec-rails de la version 2.12.0 introduit la "Fonctionnalité" spécifications pour l'exécution de Capybara tests d'acceptation. Le nouveau FeatureExampleGroup module rspec-rails est différent de RequestExampleGroup et n'a plus accès à la baie-test host! méthode. Maintenant vous voulez utiliser default_url_options à la place:

def set_host (host)
  # host! host
  default_url_options[:host] = host
  Capybara.app_host = "http://" + host
end

32voto

Andrew Points 30079

Lorsque vous avez besoin de changer l'URL à inclure le sous-domaine, vous pouvez spécifier l' app_host dans votre démarche définitions. Utiliser un nom de domaine comme lvh.me car il points de 127.0.0.1:

Capybara.app_host = "http://#{subdomain}.lvh.me"

Capybara suppose que lorsque vous êtes à la spécification d'un app_host que vous faites des tests sur un serveur distant s'exécute sur le port 80, mais dans notre cas, nous sommes en train de tester un local de l'application qui s'exécute sur un port aléatoire spécifié par Capybara. Pour résoudre ce problème, dans votre env.rb le fichier, ajoutez cette ligne:

Capybara.always_include_port = true

Maintenant, lorsque vous visitez une page de votre application...

visit '/page'

...l'url de spécifier le sous-domaine ainsi que le port sur lequel l'application est en cours d'exécution sur.

Pour info: Cela a fonctionné pour moi, en utilisant le Capybara 2.0.2.

5voto

Jacob Points 110

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'
 

1voto

James Tan Points 35

à partir de:

  • capybara (2.4.1)
  • 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
     

0voto

Rimian Points 7805

Ce n'est pas exactement la même situation que vous, mais cela peut aider certaines personnes:

Pour mon projet actuel, je suis en utilisant pow avec de nombreux sous-domaines. La suite de test a également pour s'exécuter sur un autre port.

La solution dépend de la version de capybara vous êtes en cours d'exécution.

Pour le courant de la dernière version, j'ai mis cela 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 de modifier lib/capybara/serveur.rb dans la pierre 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

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