10

何らかの理由で、devise ヘルパー メソッド sign_in を機能させることができません。current_user は null のままです。何が問題なのですか?

テスト:

  before :each do
    @user = FactoryGirl.create :user
    sign_in @user
  end

  describe "GET index" do
    it "assigns all subscribers as @subscribers" do
      subscriber = @user.subscribers.create! valid_attributes
      get :index
      assigns(:subscribers).should eq([subscriber])
    end
  end

実装:

  def index
    @subscribers = current_user.subscribers.all    <------- ERROR

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @subscribers }
    end
  end

Error:
 NoMethodError:
       undefined method `subscribers' for nil:NilClass

どんな助けでも大歓迎です。ありがとう!

4

4 に答える 4

18

モデル (または他のデバイス認証可能なモデル) にConfirmableモジュールを含める場合、作成したテストを有効にするために確認する必要があります。User@usersign_in

before :each do
  @user = FactoryGirl.create :user
  @user.confirm!
  sign_in @user
end

(これはあなたの問題ではないようですが、おそらく別の読者が恩恵を受けるでしょう。)

于 2015-07-11T02:46:13.870 に答える
12

コードから判断すると、これを解決したようです。私は以前にこれが起こったことがありますが、何らかの理由で毎回私を悩ませています。

コントローラ スペックの rspec/rails スキャフォールドは、そのままでは Devise::TestHelpers では機能しません。

get :index, {}, valid_session

valid_session 呼び出しは、Devise が設定したセッションのものを上書きします。それを除く:

get :index, {}

これはうまくいくはずです!

于 2012-09-19T21:38:33.960 に答える
5

Devise 4.2.0+ のバージョンでは、Devise::TestHelpersは廃止されました。代わりに、Devise::Test::ControllerHelpers使用する必要があります。

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :controller
end

変更ログ


仕様については、必ずinclude Devise::TestHelpers. 簡単にするために、私のspec/spec_helper.rbには次のものがあります。

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

これにより、すべてのコントローラー仕様に自動的に含まれます。

また、sign_in を機能させるには、次のようにする必要があります。

@request.env["devise.mapping"] = Devise.mappings[:user]
get :new

@request.env["devise.mapping"] = Devise.mappings[:user]before(:each) に追加するのがおそらく最善です。(すべてのコントローラーに対してこれを行いたくない場合は、構成でこれを行うことができることに注意してください)。


パーツについては、呼び出すcurrent_userモデルがあることを確認してくださいUserdevise

class User < ActiveRecord::Base
  # call devise to define user_signed_in? and current_user
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable
  # though you don't have to include all these modules
end

Devise は User モデルで呼び出しを使用して定義user_signed_in?current_user、コントローラーで使用します。その理由は、次の場合です。

class Admin < ActiveRecord::Base
  devise
end

その後、Devise にはメソッドがadmin_signed_in?あり、current_admin定義されます。

于 2012-09-01T09:23:15.033 に答える
0

私が書いていた SSO エンドポイントがユーザーのセッションを作成していることをテストしようとしたときに、この問題が発生しました。1 つのテストにしか適用されないため、テストの前に次のブロックを追加する必要がありました

  before do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    user = FactoryGirl.create(:user, :email => email, :password => "password")
    user.confirm!
  end

  it "should create and session for the user and redirect to home page" do
于 2015-08-18T15:24:05.063 に答える