的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文件,但这没有帮助。有什么想法吗?
答案 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行。