Rails + rspec + devise =未定义的方法`authenticate_user!'

时间:2012-01-11 12:34:51

标签: ruby-on-rails rspec devise

的ApplicationController:

class ApplicationController < ActionController::Base
  before_filter :authenticate_user!

  protect_from_forgery
end

DashboardsController:

class DashboardsController < ApplicationController
  def index
  end

end

DashboardsControllerSpec:

require 'spec_helper'
describe DashboardsController do
  include Devise::TestHelpers

  describe "GET 'index'" do
    it "returns http success" do
      get 'index'
      response.should be_success
    end
  end
end

结果:

Failure/Error: get 'index'
     NoMethodError:
       undefined method `authenticate_user!' for #<DashboardsController:0x007fef81f2efb8>

Rails版本:3.1.3

Rspec版本:2.8.0

设计版本:1.5.3

注意:我还创建了support / deviser.rb文件,但这没有帮助。有什么想法吗?

4 个答案:

答案 0 :(得分:12)

require 'spec_helper'
describe DashboardsController do
  before { controller.stub(:authenticate_user!).and_return true }
  describe "GET 'index'" do
    it "returns http success" do
      get 'index'
      response.should be_success
    end
  end
end

更新

使用上述语法和最新的rspec将给出以下警告

Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from  `block (2 levels) in <top (required)>'.

使用此新语法

  before do
     allow(controller).to receive(:authenticate_user!).and_return(true)
   end

答案 1 :(得分:7)

您的型号名称是否不是User?如果它是例如管理员,然后您需要将过滤器更改为:

before_filter :authenticate_admin!

这让我有一段时间了;我开始使用User作为我的模型,后来决定将Devise添加到名为Member的模型中,但是我将原始:authenticate_user!保留在我的控制器中,并在运行RSpec时不断收到该错误。

答案 2 :(得分:3)

看起来最好的方法是在spec_helper.rb文件中执行以下操作:

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

有关详细信息,请参阅rspec wiki

答案 3 :(得分:1)

在我的情况下,我忘记了我在routes.rb文件中注释掉了devise_for行。