Tüm Ruby testleri yükseltme: tanımlanmamış yöntem `` Authenticate '' için nil: NilClass


132

Testlerimin çoğu aşağıdakileri artırıyor ve nedenini anlamıyorum. Tüm yöntemler çağrısı 'kimlik doğrulama' hatasını ortaya çıkarır. "Authenticate" adlı bir yöntem olup olmadığını kontrol ettim ancak böyle bir yöntem yok.

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

Testleri kendi başınıza çalıştırmak istemeniz durumunda proje orada => https://github.com/agilepandas/enki bulunabilir .

Yanıtlar:



74

Rspec kullandığınızın farkındayım ama aynı sorunla karşılaşabilirsiniz Test::Unit. Sadece test yardımcılarını eklemeniz gerekir.test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

Yukarıdaki cevap benim için işe yaramadı (RSpec 3.1)

Benim için çalışan bir çözüm için https://stackoverflow.com/a/21166482/1161743 sayfasına bakın .

Değişkenleri ayarlamadan önce anonim bir kullanıcının oturumunu kapatmanız gerekecektir:

before :each do
  sign_out :user
end

1
Ayrıca, Devise :: TestHelpers'ı birden çok kez eklemediğinizden emin olun, çünkü bu sorunlara neden olabilir.
Joseph Siefers

8

RSpec'de

Jeffrey W.'nin bahsettiği gibi, yukarıdaki cevabında -> bunu tüm kontrolörlere ayarlamak için:

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

bununla birlikte, eğer bu sadece bir spesifikasyonla ilgiliyse, tüm kontrolör özelliklerinize tasarlama yardımcıları eklemeniz gerekmez, bu yardımcıları tek bir kontrolcünün bloğu tanımlayan bölümüne açıkça dahil edebilirsiniz:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end

2

Projelerimden birinde aynı hataları yaşıyordum. Ruby 2.0.0-p598, Rails 3.2.21, RSpec 2.99 kullanıyor. Tüm özellikleri birlikte çalıştırdığımda sorun oluştu. Özellikleri tek tek çalıştırdığımda, geçti. Spec / spec_helper.rb dosyamda aşağıdakiler var:

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

Başarısız olan her özellik dosyasındaki ilk açıklamaya aşağıdakileri ekledim. Bu sorunu çözmedi:

before :each do
  sign_out :user
end

Ne yapmadı:

after :each do
  sign_out :user
end

Bu stackoverflow sorusunun yanıtından ilham alarak , hangilerinin birbirini engelleyebileceğini bulmak için farklı rspec dizini kombinasyonlarını birlikte çalıştırdım. Sonunda aradığımı keşfettim:

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

bunun tüm oluşumlarını şu şekilde değiştirdiğimde:

before(:each) do
  :
end

Tüm özellikler hatasız geçti:

undefined method `authenticate' for nil:NilClass

Umarım bu başkalarına yardımcı olur.


0

Görünüm spesifikasyonuyla çalışıyorsanız current_user,. Bu current_user, sizin görüşünüzden aranan yardımcıyı, döndürülen şeyle etkili bir şekilde geçersiz kılar . Rspec-3.2.3 ile şu şekilde:

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

Görünüşe göre kaynak kodunda bazı güncellemeler var. ApplicationController, authenticate_user!herhangi bir istekten önce bir filtrenin çalıştırılması gerektiğini belirtir . Bu ileti dizisi, onunla ilgili bazı arka plan bilgileri sağlar:

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

Esasen, authenticate_user!işlev Rails 3'ün bir parçasıdır ( devisehakkında çok az şey bildiğim yeni özelliği kullanarak ). Uygulama Kullanıcı modelini bulamazsa (ad alanı sorunları nedeniyle veya herhangi bir nedenle), yöntem başarısız olur. Bağlandığınız "enki" uygulaması artık bir Rails 3 uygulamasıdır. Dönüşürken birkaç acı çekiyor olabilir.


2
Bu cevap yaklaşık% 99 saf saçmalıktır.
en fazla

-20

Ruby size bu yöntemin #authenticatehenüz tanımlanmadığını söylüyor nil. Bunu şu şekilde kolayca yapabilirsiniz:

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

Ve hata ortadan kalkacak.


1
lütfen bunu yapmayın. nil is nil, vakaların% 90'ında geçerli bir nesne değildir.
Tiago Peczenyj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.