所有的Ruby测试提高:nil:NilClass的未定义方法“ authenticate”


132

我的大部分测试都提出了以下问题,但我不明白为什么。所有方法调用都会引发“身份验证”错误。我已经检查了代码中是否存在一种称为“ authenticate”的方法,但是没有这种方法。

  1) Admin::CommentsController handling GET to index is successful
     Failure/Error: get :index
     undefined method `authenticate!' for nil:NilClass
     # ./spec/controllers/admin/comments_controller_spec.rb:9:in `block (3 levels) in <top (required)>'


  124) PostsController handling GET for a single post should render show template
     Failure/Error: get :show, :year => '2008', :month => '01', :day => '01', :slug => 'a-post'
     undefined method `authenticate' for nil:NilClass
     # ./app/controllers/application_controller.rb:18:in `set_current_user_for_model'
     # ./spec/controllers/posts_controller_spec.rb:131:in `do_get'
     # ./spec/controllers/posts_controller_spec.rb:140:in `block (3 levels) in <top (required)>'

该项目可以在那找到=> https://github.com/agilepandas/enki,以防您想自己进行测试。

Answers:



74

我知道您正在使用Rspec,但是您可能会遇到相同的问题Test::Unit。您只需要将devise测试助手添加到test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end


8

在RSpec中

如Jeffrey W.所述,在上面答案中 ->将此设置为所有控制器:

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

但是,如果这仅与一个规范有关,那么您不必在所有控制器规范中都包含设计助手,您可以在一个控制器describe块中明确包含这些助手:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end

2

我在一个项目中遇到了同样的失败。它使用的是Ruby 2.0.0-p598,Rails 3.2.21,RSpec 2.99。当我同时运行所有规格时,出现了问题。当我单独运行规格时,它们通过了。我的spec / spec_helper.rb中包含以下内容:

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

我在每个失败的规范文件的第一个描述中添加了以下内容。这不能解决问题:

before :each do
  sign_out :user
end

都没有:

after :each do
  sign_out :user
end

这个 stackoverflow问题的答案中获得启发,我将rspec目录的不同组合在一起运行,以找出哪些目录可能相互干扰。最后我发现我在打电话:

before() do #note no :each passed to before
  :
end

当我将所有出现的情况更改为:

before(:each) do
  :
end

所有规格均通过无误:

undefined method `authenticate' for nil:NilClass

我希望这对其他人有帮助。


0

如果您使用的是视图规格,则可以存根current_user。这有效地覆盖了current_user从您的视图调用的带有任何返回值的帮助程序。使用rspec-3.2.3的方法如下:

RSpec.describe "projects/show", type: :view do
  before(:each) do
    allow(view).to receive(:current_user).and_return(FactoryGirl.create(:user))
  end

  it "renders attributes in <p>" do
    render
    expect(rendered).to match(/whatever you want to regex match here/)
  end
end

-3

看起来源代码有一些更新。ApplicationController指定authenticate_user!在任何请求之前都需要运行过滤器。该线程提供了有关它的问题的一些背景知识:

http://groups.google.com/group/plataformatec-devise/browse_thread/thread/f7260ebe2d9f7316?fwc=1

本质上,该authenticate_user!功能是Rails 3的一部分(使用新devise功能,对此我鲜为人知)。如果应用程序找不到用户模型(由于名称空间问题或其他原因),则该方法将失败。您链接到的“ enki”应用程序现在是Rails 3应用程序。随着转换的进行,它可能会遇到一些成长的烦恼。


2
这个答案大约是99%的废话。
最高

-20

红宝石在告诉你,这种方法#authenticate还没有被definded上nil呢。您可以通过以下方法轻松实现:

def nil.authenticate!
  puts "Bingo! Nil is now authentic!"
end

错误将消失。


1
请不要这样做。nil为nil,在90%的情况下不是有效对象。
Tiago Peczenyj 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.