web-dev-qa-db-ja.com

Rails rspec set subdomain

アプリケーションのテストにrSpecを使用しています。私のアプリケーションコントローラーには、次のようなメソッドがあります。

def set_current_account
  @current_account ||= Account.find_by_subdomain(request.subdomains.first)
end

私の仕様でrequest.subdomainを設定することは可能ですか?たぶん前のブロックに?私はrSpecを初めて使用するので、これについてのアドバイスはありがたいです。

Eef

57
RailsSon

この問題を分類する方法を見つけました。

私の仕様の前のブロックで、私は単に追加しました:

before(:each) do
  @request.Host = "#{mock_subdomain}.example.com"
end

これにより、request.subdomains.firstがmock_subdomainの値になるように設定されます。

ネット上のどこでもあまり説明されていないので、誰かがこれが便利だと思うことを願っています。

87
RailsSon

これは比較的古い質問であることはわかっていますが、これは実行しているテストの種類に依存することがわかりました。 Rails 4とRSpec 3.2も実行しているので、この質問が行われてから、いくつかの点が変更されたと思います。

要求仕様

before { Host! "#{mock_subdomain}.example.com" }

カピバラの機能仕様

before { Capybara.default_Host = "http://#{mock_subdomain}.example.com" }
after  { Capybara.default_Host = "http://www.example.com" }

通常、spec/supportに次のようなモジュールを作成します。

# spec/support/feature_subdomain_helpers.rb
module FeatureSubdomainHelpers
  # Sets Capybara to use a given subdomain.
  def within_subdomain(subdomain)
    before { Capybara.default_Host = "http://#{subdomain}.example.com" }
    after  { Capybara.default_Host = "http://www.example.com" }
    yield
  end
end

# spec/support/request_subdomain_helpers.rb
module RequestSubdomainHelpers
  # Sets Host to use a given subdomain.
  def within_subdomain(subdomain)
    before { Host! "#{subdomain}.example.com" }
    after  { Host! "www.example.com" }
    yield
  end
end

spec/Rails_helper.rbに含める:

RSpec.configure do |config|
  # ...

  # Extensions
  config.extend FeatureSubdomainHelpers, type: :feature
  config.extend RequestSubdomainHelpers, type: :request
end

次に、仕様内で次のように呼び出すことができます。

feature 'Admin signs in' do
  given!(:admin) { FactoryGirl.create(:user, :admin) }

  within_subdomain :admin do
    scenario 'with valid credentials' do
      # ...
    end

    scenario 'with invalid password' do
      # ...
    end
  end
end
41
Chris Peters

Rails 3では、ホストを手動で設定しようとしてもすべて機能しませんでしたが、コードを見ると、getのようなリクエストヘルパーに渡すパスを適切に解析したことがわかりました。コントローラーがサブドメインで言及されているユーザーを取得して取得し、@king_of_the_castle

it "fetches the user of the subomain" do
  get "http://#{mock_subdomain}.example.com/rest_of_the_path"
  assigns[:king_of_the_castle].should eql(User.find_by_name mock_subdomain)
end
8
ilpoldo
  • Rspec-3.6.0
  • カピバラ-2.15.1

クリスピーターズの回答はリクエストスペックでは機能しましたが、フィーチャースペックでは次の変更を行う必要がありました。

Rails_helper:

Capybara.app_Host = 'http://lvh.me'
Capybara.always_include_port = true

feature_subdomain_helpers:

module FeatureSubdomainHelpers
    def within_subdomain(subdomain)
        before { Capybara.app_Host = "http://#{subdomain}.lvh.me" }
        after  { Capybara.app_Host = "http://lvh.me" }
        yield
    end
end
1
mridula