Tất cả các thử nghiệm nâng cao của Ruby: phương thức không xác định 'xác thực' cho nil: NilClass


132

Hầu hết các bài kiểm tra của tôi đều đưa ra những điều sau đây và tôi không hiểu tại sao. Tất cả các phương thức gọi đều gây ra lỗi 'xác thực'. Tôi đã kiểm tra mã nếu có một phương thức gọi là "xác thực" nhưng không có phương pháp đó.

  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)>'

Dự án có thể được tìm thấy ở đó => https://github.com/agilepandas/enki trong trường hợp bạn muốn tự chạy thử nghiệm.

Câu trả lời:


191

Câu hỏi này đã được trả lời trên Twitter bởi @MatthewClosson

@jeffehh Bạn cần tạo tệp spec / support / devise.rb như được chỉ định tại đây https://github.com/plataformatec/devise#test-helpers để bao gồm người trợ giúp kiểm tra phát minh #ruby

Một lần nữa xin cảm ơn.


2
Ghi nhật ký URL thực tế (thay vì bit.ly): trên trang phát minh ( github.com/plataformatec/devise ), xem phần "Người trợ giúp kiểm tra".
Zabba

74

Tôi biết bạn đang sử dụng Rspec nhưng bạn có thể gặp phải vấn đề tương tự Test::Unit. Bạn chỉ cần thêm các trợ giúp kiểm tra nghĩ ratest/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

Câu trả lời trên không hiệu quả với tôi (RSpec 3.1)

Xem https://stackoverflow.com/a/21166482/1161743 để biết giải pháp hiệu quả với tôi.

Bạn sẽ cần phải đăng xuất một người dùng ẩn danh trước khi thiết lập các biến:

before :each do
  sign_out :user
end

1
Ngoài ra, hãy kiểm tra xem bạn đã bao gồm Devise :: TestHelpers nhiều lần vì điều này có thể gây ra sự cố.
Joseph Siefers

8

trong RSpec

như Jeffrey W. đã đề cập, trong câu trả lời của mình ở trên -> để đặt điều này cho tất cả các bộ điều khiển:

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

tuy nhiên, nếu điều này có liên quan đến chỉ một thông số kỹ thuật, bạn không nhất thiết phải bao gồm người trợ giúp nghĩ ra cho tất cả thông số kỹ thuật của bộ điều khiển, bạn chỉ có thể bao gồm rõ ràng những người trợ giúp đó trong khối mô tả bộ điều khiển đó:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end

2

Tôi đã trải qua những thất bại tương tự trong một trong các dự án của tôi. Nó đang sử dụng Ruby 2.0.0-p598, Rails 3.2.21, RSpec 2.99. Khi tôi chạy tất cả các thông số kỹ thuật cùng nhau, vấn đề xảy ra. Khi tôi chạy các thông số kỹ thuật cá nhân, họ đã vượt qua. Tôi có những điều sau đây bao gồm trong spec / spec_helper.rb của tôi:

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

Tôi đã thêm vào sau đây để mô tả đầu tiên trong mỗi tập tin spec thất bại. Điều này đã không giải quyết vấn đề:

before :each do
  sign_out :user
end

Cũng không:

after :each do
  sign_out :user
end

Lấy cảm hứng từ câu trả lời cho câu hỏi stackoverflow này , tôi đã chạy các kết hợp khác nhau của các thư mục rspec với nhau để tìm ra cái nào có thể can thiệp lẫn nhau. Cuối cùng, tôi phát hiện ra mình đang gọi:

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

khi tôi thay đổi tất cả các lần xuất hiện này thành:

before(:each) do
  :
end

Tất cả các thông số kỹ thuật được thông qua mà không có sự thất bại:

undefined method `authenticate' for nil:NilClass

Tôi hy vọng điều này là giúp đỡ cho người khác.


0

Nếu bạn đang làm việc với thông số kỹ thuật xem, bạn có thể sơ khai current_user. Điều này có hiệu quả ghi đè người current_usertrợ giúp được gọi từ quan điểm của bạn với bất cứ điều gì được trả lại. Đây là cách thực hiện với 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

Có vẻ như có một số cập nhật cho mã nguồn. ApplicationContoder chỉ định rằng cần phải có authenticate_user!bộ lọc chạy trước mọi yêu cầu. Chủ đề này cung cấp một số nền tảng về các vấn đề với nó:

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

Về cơ bản, authenticate_user!chức năng này là một phần của Rails 3 (sử dụng devisetính năng mới , trong đó tôi biết rất ít). Nếu ứng dụng không thể tìm thấy mô hình Người dùng (vì vấn đề không gian tên hoặc bất kỳ lý do gì) thì phương thức sẽ thất bại. Ứng dụng "enki" mà bạn liên kết hiện là ứng dụng Rails 3. Nó có thể trải qua một vài cơn đau ngày càng tăng khi nó chuyển đổi.


2
Câu trả lời này là khoảng 99% vô nghĩa.
tối đa

-20

Ruby đang nói với bạn, phương pháp #authenticateđó chưa được giải quyết nil. Bạn có thể làm điều đó một cách dễ dàng bằng cách:

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

Và lỗi sẽ biến mất.


1
xin đừng làm điều này nil là nil, không phải là một đối tượng hợp lệ trong 90% các trường hợp.
Tiago Peczenyj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.