web-dev-qa-db-ja.com

サブドメインを持つカピバラ-default_host

サブドメインを使用してデータベースを切り替えるアプリがあります(マルチテナンシー)。統合テストにCapybaraを使用しようとしていますが、サブドメインに大きく依存しています。

私の理解では、_Capybara.default_Host=_を何かに設定すると、すべてのリクエストがこのホストから送信されます。これは事実ではないようです。 この投稿 で、著者はホストを使用して明示的なURLにアクセスすることを推奨していますが、あちこちをナビゲートしている場合、これは少し面倒になります。ホストを設定し、期待どおりにRailsパスを使用できるようにしたいと思います。何が間違っているのかわかりませんが、ここで試したことは次のとおりです。

_# 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
_

これにより、出力が生成されます。

_Capybara.default_Host: http://app.mydomain.com
some_app_url: http://www.example.com/some_path
_

私は何を間違えていますか? _default_Host_は何もしないようです。私が言うように、visit(Capybara.default_Host + some_app_path)と言う必要はありません。毎回少し面倒です。なぜこのdefault_Hostオプションが存在するのですか?

46
brad

default_Hostの使用目的はわかりませんが、app_Hostは必要なことを行います。要求オブジェクトでコントローラーに渡されるホスト文字列を設定するために、最初にRailsセッションメソッドHost!]を呼び出す必要があることがわかりました。

次に、Capybara.app_Hostを設定して、処理中の呼び出しを行うだけでなく、Webサーバー経由でアプリを呼び出すようにCapybaraに指示する必要があります。そうしないと、リダイレクトが発生したときにCapybaraがウィッグアウトし、2番目のリクエストのホスト情報を削除します。

Rails requestの終了を自動的に処理しない理由はわかりませんが、両方の場所でホストを明示的に設定しない限り、 、その後、一貫性のない結果が得られます。

def set_Host (Host)
  Host! Host
  Capybara.app_Host = "http://" + Host
end

before(:each) do
  set_Host "lvh.me:3000"
end

次に、相対パスを使用してページにアクセスできます。

更新:

Capybara 2.xおよびrspec-Rails 2.12. Capybara受け入れテストを実行するための「機能」仕様が導入されました。 rspec-Railsの新しいFeatureExampleGroupモジュールはRequestExampleGroupと異なり、rack-test Host!メソッドにアクセスできなくなりました。代わりにdefault_url_optionsを使用したい場合:

def set_Host (Host)
  # Host! Host
  default_url_options[:Host] = Host
  Capybara.app_Host = "http://" + Host
end
59
Lachlan Cotter

URLを変更してサブドメインを含める必要がある場合、ステップ定義でapp_Hostを指定できます。 lvh.meを指すので、127.0.0.1などのドメインを使用します。

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

Capybaraは、app_Hostを指定する場合、ポート80で実行されているリモートサーバーをテストしていると想定しますが、この場合、Capybaraで指定されたランダムポートで実行されているローカルアプリをテストしています。これを修正するには、env.rbファイルに次の行を追加します。

Capybara.always_include_port = true

アプリのページにアクセスすると...

visit '/page'

... URLは、サブドメインと、アプリが実行されているポートを指定します。

参考までに、これはCapybara 2.0.2を使用してうまくいきました。

32
Andrew

この男は正しい答えをここに持っています:

http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M

やりたい

Capybara.current_session.driver.reset!
Capybara.default_Host = 'http://app.mydomain.com'
5
Jacob

のように:

  • カピバラ(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

これはあなたとまったく同じ状況ではありませんが、これは一部の人々を助けるかもしれません:

現在のプロジェクトでは、多くのサブドメインで pow を使用しています。また、テストスイートは別のポートで実行する必要があります。

解決策は、実行しているcapybaraのバージョンによって異なります。

現在の最新リリースでは、これを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

Capybara 1.1.2では、上記の変更を行う必要がありましたが、server_Hostapp_Hostになり、gemのlib/capybara/server.rbを次のように変更します。

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