10

出于某种原因,我无法让设计辅助方法 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

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

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零件,请确保您有一个模型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

Devise 使用 User 模型中的调用来定义user_signed_in?current_user在您的控制器中。原因是,如果您有:

class Admin < ActiveRecord::Base
  devise
end

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

于 2012-09-01T09:23:15.033 回答
0

我在尝试测试我正在编写的 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
于 2015-08-18T15:24:05.063 回答