サブドメインを使用してデータベースを切り替えるアプリがあります(マルチテナンシー)。統合テストに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オプションが存在するのですか?
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
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を使用してうまくいきました。
この男は正しい答えをここに持っています:
http://zurb.com/forrst/posts/Testing_Subdomains_in_Capybara-g4M
やりたい
Capybara.current_session.driver.reset!
Capybara.default_Host = 'http://app.mydomain.com'
のように:
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
これはあなたとまったく同じ状況ではありませんが、これは一部の人々を助けるかもしれません:
現在のプロジェクトでは、多くのサブドメインで 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_Host
はapp_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