web-dev-qa-db-fra.com

Capybara avec sous-domaines - default_host

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?

47
brad

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
59
Lachlan Cotter

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.

32
Andrew

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'
5
Jacob

au:

  • 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
    
1
James Tan

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
0
Rimian