4

キュウリの機能の大部分では、ユーザーがログインする必要があります。ただし、すべてのテストでログイン機能をテストする必要はありません。現在、認証にDeviseを使用しています。

サインインフォームに入力せずに、devise でユーザーをサインインする方法を探しています。とにかくこれを行うことはありますか?すべてのテストでサインイン アクションを使用する必要はありません。

4

2 に答える 2

2

いいえ、仕方がありません。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

認証ルールを変更すると(つまり、ユーザーが特定のパスにログインする必要があるかどうか)、テスト全体を取得して、何も変更せずに他の説明ブロックに移動できるため、これは非常に便利であることがわかりました。より多くのコード。

于 2013-01-31T23:02:21.070 に答える
0

一般に、常にインターフェイスを介してテストする必要があります。しかし、これは許容できる例外だと思います。

私は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

参照:
Capybara テストで Rspec を使用して Warden/Devise をスタブ化する方法

于 2013-02-01T02:48:11.663 に答える