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

Kar*_*ran 9 testing ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

执行:

  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
Run Code Online (Sandbox Code Playgroud)

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

Jel*_*Cat 12

如果ConfirmableUser模型中包含模块(或其他可设计版本的模型),则@user必须确认您创建的测试sign_in才能生效:

before :each do
  @user = FactoryGirl.create :user
  @user.confirm!
  sign_in @user
end
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供读者参考:“确认!” 已不推荐使用;您应该改用“确认”。 (2认同)
  • 我一整天都在为此苦苦挣扎。但我的解决方法是在工厂女孩上设置 `confirmed_at { Time.now }` (2认同)

Tyl*_*non 11

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

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

get :index, {}, valid_session
Run Code Online (Sandbox Code Playgroud)

valid_session调用会覆盖Devise设置的会话内容.去掉它:

get :index, {}
Run Code Online (Sandbox Code Playgroud)

这应该工作!


ron*_*chn 5

对于规范,请确保include Devise::TestHelpers.为了方便起见,在我的spec/spec_helper.rb中,我有:

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end
Run Code Online (Sandbox Code Playgroud)

它自动包含所有控制器规格.

此外,您需要执行此操作以使sign_in工作:

@request.env["devise.mapping"] = Devise.mappings[:user]
get :new
Run Code Online (Sandbox Code Playgroud)

最好添加@request.env["devise.mapping"] = Devise.mappings[:user]到之前(: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
Run Code Online (Sandbox Code Playgroud)

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

class Admin < ActiveRecord::Base
  devise
end
Run Code Online (Sandbox Code Playgroud)

然后Devise会有方法admin_signed_in?current_admin定义.