アプリケーションのテストにrSpecを使用しています。私のアプリケーションコントローラーには、次のようなメソッドがあります。
def set_current_account
@current_account ||= Account.find_by_subdomain(request.subdomains.first)
end
私の仕様でrequest.subdomainを設定することは可能ですか?たぶん前のブロックに?私はrSpecを初めて使用するので、これについてのアドバイスはありがたいです。
Eef
この問題を分類する方法を見つけました。
私の仕様の前のブロックで、私は単に追加しました:
before(:each) do
@request.Host = "#{mock_subdomain}.example.com"
end
これにより、request.subdomains.firstがmock_subdomainの値になるように設定されます。
ネット上のどこでもあまり説明されていないので、誰かがこれが便利だと思うことを願っています。
これは比較的古い質問であることはわかっていますが、これは実行しているテストの種類に依存することがわかりました。 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
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
クリスピーターズの回答はリクエストスペックでは機能しましたが、フィーチャースペックでは次の変更を行う必要がありました。
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