设计测试助手 - sign_in不起作用

时间:2012-09-01 09:17:44

标签: ruby-on-rails testing 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 个答案:

答案 0 :(得分:11)

看起来你解决了这个问题,根据你的代码来判断。我之前已经发生过这种情况,并且出于某种原因它每次都会让我感受到。

控制器规范的rspec / rails脚手架不适用于开箱即用的Devise :: TestHelpers。

get :index, {}, valid_session

valid_session调用会覆盖Devise设置的会话内容。删除它:

get :index, {}

这应该有效!

答案 1 :(得分:10)

如果您在Confirmable模型(或其他设计可验证的模型)中包含User模块,则必须为@user确认您创建的测试sign_in生效:

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

(我知道这不是你的问题,但也许另一位读者可以从中受益。)

答案 2 :(得分:5)

对于规范,请务必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]添加到之前(:每个)。 (注意,如果您不想为每个控制器执行此操作,则可以在配置中执行此操作。)


对于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

然后Devise将定义方法admin_signed_in?current_admin

答案 3 :(得分: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