모든 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 에서 프로젝트를 찾을 수 있습니다 .

답변:


191

이 질문은 트위터에서 @MatthewClosson 님에 의해 답변되었습니다

@jeffehh 여기에 지정된대로 spec / support / devise.rb 파일을 만들어야합니다. https://github.com/plataformatec/devise#test-helpers 고안된 테스트 도우미를 포함하려면 #ruby

다시 한번 감사합니다.


2
bit.ly 대신 실제 URL 로깅 : 고안 페이지 ( github.com/plataformatec/devise )에서 "Test Helpers"섹션을 참조하십시오.
Zabba

74

Rspec을 사용하고 있음을 알고 있지만와 동일한 문제가 발생할 수 있습니다 Test::Unit. 고안된 테스트 도우미를 추가하기 만하면됩니다.test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

위의 답변이 저에게 효과가 없었습니다 (RSpec 3.1).

참조 https://stackoverflow.com/a/21166482/1161743를나를 위해 일한 솔루션 을 .

변수를 설정하기 전에 익명 사용자를 로그 아웃해야합니다.

before :each do
  sign_out :user
end

1
또한 Devise :: TestHelpers가 여러 번 포함되어 있지 않은지 확인하면 문제가 발생할 수 있습니다.
Joseph Siefers

8

RSpec에서

Jeffrey W.가 언급했듯이 위의 대답에서 -> 이것을 모든 컨트롤러로 설정하십시오.

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

그러나 이것이 하나의 사양에만 관련되는 경우 반드시 모든 컨트롤러 사양에 고안 도우미를 포함시킬 필요는 없으며 해당 컨트롤러 도우미 블록에 도우미를 명시 적으로 포함시킬 수 있습니다.

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

루비는 그 방법 #authenticatenil아직 정의되지 않았다고 말합니다 . 다음과 같은 방법으로 쉽게 할 수 있습니다.

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

그리고 오류는 사라질 것입니다.


1
제발 이러지마 nil은 nil이며 90 %의 경우에 유효한 객체가 아닙니다.
Tiago Peczenyj 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.