web-dev-qa-db-ja.com

Railsでテストするためにデフォルトの「www.example.com」ドメインを変更するにはどうすればよいですか?

私はRailsアプリケーションがあり、アクセス先のドメインに応じて異なる動作をします(たとえば、www.myapp.comはuser.myapp.comに対して異なる呼び出しを行います)。本番環境での使用では、これはすべてうまく機能しますしかし、私のテストコードでは常に「www.example.com」というホスト名が表示されます。

テストがアクセスするふりをするホスト名を指定するクリーンな方法はありますか?

51
Denis Hennessy
@request.Host = 'user.myapp.com'
29
jcrossley3

ここではすべての回答が不完全だと思います...考えられるすべてのケースを列挙するには:

  • 統合仕様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"
    

    @ AminArianaの回答 から

  • 仕様を表示ActionView::TestCaseから継承)

    @request.Host = 'my.awesome.Host'
    

    ...またはRSpecを通じて:

    controller.request.Host = "my.awesome.Host"
    

    rspec-Railsview spec docs をご覧ください。

79
deivid

機能仕様では、ホスト!廃止されました。これらを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
12
Amin Ariana

もう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 
5
mastaBlasta
4
Nuno Silva

HTTP_HostまたはSERVER_NAME環境変数を変更して、ルーターに送信されるリクエストを変更できると思います。

ENV['SERVER_NAME'] = "user.myapp.com"

actionpack/lib/action_controller/request.rbraw_Host_with_portを参照してください。

4
Dave Ray

_@request.Host = 'user.myapp.com'_は正しくありません。 Host!('user.myapp.com')を使用する必要があります

2
Ian

コントローラーテストと機能テストの両方として、@request.HostHost!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を実行しています。

1
David Hempy

その時点で他の回答で提案された方法はどれも私にとってはうまくいきませんでした。これはうまくいきました:

Capybara.configure { |config| config.default_Host = "my.domain.com" }
1
sawa

さらに別の答え:

request.Host = "user.myapp.com"

正解に似ていますが、ご容赦ください。セットアップを行うためだけにテストで割り当て操作をするのは好きではありません。明示的なスタブの方が好きです。興味深いことに、このようにスタブすることはできません機能します:

allow(request).to receive(:Host).and_return("user.myapp.com")

私は個人的に割り当てよりもスタブを好んでいます。そのため、2つの利点があります。1つはrspec's verify doubleによって検証されることです。2つ目は、それがスタブであり、テストの一部ではないことを明示的に言っていることです。運動。

0
Hendra Uzia