私はRailsアプリケーションがあり、アクセス先のドメインに応じて異なる動作をします(たとえば、www.myapp.comはuser.myapp.comに対して異なる呼び出しを行います)。本番環境での使用では、これはすべてうまく機能しますしかし、私のテストコードでは常に「www.example.com」というホスト名が表示されます。
テストがアクセスするふりをするホスト名を指定するクリーンな方法はありますか?
@request.Host = 'user.myapp.com'
ここではすべての回答が不完全だと思います...考えられるすべてのケースを列挙するには:
統合仕様(ActionDispatch::IntegrationTest
から継承):
Host! "my.awesome.Host"
docs 、セクション5.1統合テストに利用できるヘルパーを参照してください。
コントローラの仕様(ActionController::TestCase
から継承)
@request.Host = 'my.awesome.Host'
docs 、セクション4.4使用可能なインスタンス変数を参照してください。
機能の仕様(カピバラ経由)
Capybara.default_Host = "http://my.awesome.Host"
# Or to configure domain for route helpers:
default_url_options[:Host] = "my.awesome.Host"
仕様を表示(ActionView::TestCase
から継承)
@request.Host = 'my.awesome.Host'
...またはRSpecを通じて:
controller.request.Host = "my.awesome.Host"
rspec-Rails
view spec docs をご覧ください。
機能仕様では、ホスト!廃止されました。これらをrspec_helper.rbに追加します。
# Configure Capybara expected Host
Capybara.app_Host = <myhost>
# Configure actual routes Host during test
before(:each) do
default_url_options[:Host] = <myhost>
end
もう1つ覚えておかなければならないのは、正しいセッションインスタンスを使用して、URLヘルパーを適切にカプセル化できるようにすることです。
統合テストでは、デフォルトのセッションが提供されます。テストから直接 すべてのセッションメソッド を呼び出すことができます
test "should integrate well" do
https!
get users_path
assert_response :success
end
これらのヘルパーはすべて、デフォルトのセッションインスタンスを使用しています。変更されていない場合は、「www.example.com」にアクセスします。すでに述べたように、ホストはHost!( "my.new.Host")を実行することで変更できます。
Open_sessionメソッドを使用して複数のセッションを作成する場合は、常にそのインスタンスを使用してヘルパーメソッドを呼び出す必要があります。これにより、リクエストが適切にカプセル化されます。そうでない場合、Railsは、別のホストを使用する可能性があるデフォルトのセッションインスタンスを呼び出します。
test "should integrate well" do
sess = open_session
sess.Host! "my.awesome.Host"
sess.get users_url #=> WRONG! will use default session object to build url.
sess.get sess.users_url #=> Correctly invoking url writer from my custom session with new Host.
sess.assert_response :success
end
デフォルトのセッションオブジェクトを使用する場合は、そのホストも変更する必要があります。
test "should integrate well" do
sess = open_session
sess.Host! "my.awesome.Host"
Host! sess.Host #=> Set default session Host to my custom session Host.
sess.get users_url
end
Rspec要求仕様の場合、before(:each) { Host! 'example.com' }
を使用します
詳しくは https://relishapp.com/rspec/rspec-Rails/v/3-6/docs/request-specs/request-spechttps:// github。 com/rspec/rspec-Rails/issues/1662#issuecomment-241201056
HTTP_Host
またはSERVER_NAME
環境変数を変更して、ルーターに送信されるリクエストを変更できると思います。
ENV['SERVER_NAME'] = "user.myapp.com"
actionpack/lib/action_controller/request.rb のraw_Host_with_port
を参照してください。
_@request.Host = 'user.myapp.com'
_は正しくありません。 Host!('user.myapp.com')
を使用する必要があります
コントローラーテストと機能テストの両方として、@request.Host
、Host!
、post path, args, {'SERVER_NAME' => my_secret_domain}
のさまざまなバリエーションを試しましたが、成功しませんでした。他の多くの人がこれらのアプローチの成功を報告したので、非常に悪化しました。
私のための解決策は:
request.headers["SERVER_NAME"] = my_secret_domain
post path, args
私はRuby 2.1.5p273、rspec 3.1.7およびRails 4.2.0を実行しています。
その時点で他の回答で提案された方法はどれも私にとってはうまくいきませんでした。これはうまくいきました:
Capybara.configure { |config| config.default_Host = "my.domain.com" }
さらに別の答え:
request.Host = "user.myapp.com"
正解に似ていますが、ご容赦ください。セットアップを行うためだけにテストで割り当て操作をするのは好きではありません。明示的なスタブの方が好きです。興味深いことに、このようにスタブすることはできません機能します:
allow(request).to receive(:Host).and_return("user.myapp.com")
私は個人的に割り当てよりもスタブを好んでいます。そのため、2つの利点があります。1つはrspec's verify doubleによって検証されることです。2つ目は、それがスタブであり、テストの一部ではないことを明示的に言っていることです。運動。