キュウリの機能の大部分では、ユーザーがログインする必要があります。ただし、すべてのテストでログイン機能をテストする必要はありません。現在、認証にDeviseを使用しています。
サインインフォームに入力せずに、devise でユーザーをサインインする方法を探しています。とにかくこれを行うことはありますか?すべてのテストでサインイン アクションを使用する必要はありません。
キュウリの機能の大部分では、ユーザーがログインする必要があります。ただし、すべてのテストでログイン機能をテストする必要はありません。現在、認証にDeviseを使用しています。
サインインフォームに入力せずに、devise でユーザーをサインインする方法を探しています。とにかくこれを行うことはありますか?すべてのテストでサインイン アクションを使用する必要はありません。
いいえ、仕方がありません。documentationでは、ヘルパーメソッドに関してsign_in @user
、次のように述べています。sign_out @user
これらのヘルパーは、Capybara または Webrat によって駆動される統合テストでは機能しません。これらは、機能テストでのみ使用することを意図しています。代わりに、フォームに入力するか、明示的にユーザーをセッションに設定します
あなたが自分で言ったように、before :each
ブロックで行うのがおそらく最もきれいです。次のように構成するのが好きです。
context "login necessary" do
# Before block
before do
visit new_user_session_path
fill_in "Email", with: "test@test.com"
fill_in "Password", with: "password"
click_button "Login"
assert_contain "You logged in successfully."
end
# Actual tests that require the user to be logged in
it "does everything correctly" do
# ...
end
end
context "login not necessary" do
it "does stuff" do
# code
end
end
認証ルールを変更すると(つまり、ユーザーが特定のパスにログインする必要があるかどうか)、テスト全体を取得して、何も変更せずに他の説明ブロックに移動できるため、これは非常に便利であることがわかりました。より多くのコード。
一般に、常にインターフェイスを介してテストする必要があります。しかし、これは許容できる例外だと思います。
私はrspecでカピバラとデバイスを使用していますが、あなたにも役立つはずです。
ヘルパーで私はこれを持っています:
module LoginHelper
def login_as(user)
super(user, :scope => :user, :run_callbacks => false)
end
end
RSpec.configure do |config|
config.include Warden::Test::Helpers, :type => :feature
config.include LoginHelper, :type => :feature
config.before :each, :type => :feature do
Warden.test_mode!
end
config.after :each, :type => :feature do
Warden.test_reset!
end
end
次に、機能で:
background do
login_as(user)
visit root_path
end