[ruby-on-rails] 所有的Ruby測試都在升級:對於nil:NilClass,未定義的方法“authenticate”



Answers

我知道你使用的是Rspec,但你可以用Test::Unit解決這個問題。 您只需將設計測試助手添加到test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
Question

我的大部分測試都在提出以下內容,我不明白為什麼。 所有方法調用都會引發'驗證'錯誤。 我檢查了代碼是否有一種稱為“認證”的方法,但沒有這種方法。

  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如果你想運行你自己的測試。




Ruby告訴你,那個方法#authenticate還沒有被定義nil 。 你可以輕鬆地做到這一點:

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

錯誤將消失。




如果您使用視圖規範,則可以存儲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



在RSpec中

正如Jeffrey W.在上面的答案中提到的 - >將其設置給所有控制器:

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

然而,如果這僅與一個規範相關,則不一定需要在所有控制器規範中包含設計助手,您可以在那個控制器描述塊中明確包含這些助手:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end



Related