制定测试助手 - sign_in不起作用(Devise Test Helper - sign_in

2019-07-31 08:00发布

出于某种原因,我不能得到的色器件的辅助方法sign_in工作。 CURRENT_USER被继续空。 任何想法的问题可能是什么?

测试:

  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

任何帮助表示赞赏。 谢谢!

Answer 1:

看起来你解决了这个,你的代码判断。 我有这种情况发生前,出于某种原因,它让我的每一次。

RSpec的/导轨支架材料控制器的规格不会制定:: TestHelpers工作开箱。

get :index, {}, valid_session

该valid_session通话将覆盖设计建立会话的东西。 去掉它:

get :index, {}

这应该工作!



Answer 2:

如果包括Confirmable在你的模块User模型(或其它色器件,可认证的型号),然后测试@user创建必须确认为sign_in生效:

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

(我看,这是不是你的问题,但也许另一位读者应该从中受益。)



Answer 3:

对于规范,确保include Devise::TestHelpers 。 为了方便,在我的规格/ 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]您之前(:每个)。 (请注意,你可以在你的配置做,如果你不想为每个控制器做到这一点)。


对于current_user部分,确保你有一个模型User ,在那里你调用devise

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

设计使用中的呼叫用户模型中定义user_signed_in?current_user在控制器中。 原因是,如果您有:

class Admin < ActiveRecord::Base
  devise
end

然后设计将有方法admin_signed_in?current_admin定义。



Answer 4:

试图测试的SSO端点我写的是创建用户的会话时,我遇到了这个问题。 由于它仅适用于一个测试,我只需要我的测试之前,添加下列块

  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


文章来源: Devise Test Helper - sign_in does not work