Rilancio di tutti i test di Ruby: metodo indefinito `autenticare 'per zero: NilClass


132

La maggior parte dei miei test sta aumentando quanto segue e non capisco perché. Tutti i metodi call generano l'errore "autenticare". Ho controllato il codice se esisteva un metodo chiamato "autenticare" ma non esiste un metodo simile.

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

Il progetto può essere trovato laggiù => https://github.com/agilepandas/enki nel caso in cui desideri eseguire i test da solo.

Risposte:



74

Sono consapevole che stai usando Rspec ma puoi riscontrare questo stesso problema con Test::Unit. Devi solo aggiungere gli helper di test ideati atest/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8

La risposta sopra non ha funzionato per me (RSpec 3.1)

Vedi https://stackoverflow.com/a/21166482/1161743 per una soluzione che ha funzionato per me.

Devi disconnetterti da un utente anonimo prima di impostare le variabili:

before :each do
  sign_out :user
end

1
Inoltre, controlla di non aver incluso Devise :: TestHelpers più volte poiché ciò può causare problemi.
Joseph Siefers,

8

in RSpec

come ha detto Jeffrey W., nella sua risposta sopra -> per impostare questo su tutti i controller:

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

tuttavia, se questo è rilevante solo per una specifica, non è necessario necessariamente includere gli helper ideati per tutte le specifiche dei controller, è possibile includere esplicitamente quegli helper in quel blocco descrittore di un controller:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end

2

Stavo vivendo gli stessi fallimenti in uno dei miei progetti. Sta usando Ruby 2.0.0-p598, Rails 3.2.21, RSpec 2.99. Quando ho eseguito tutte le specifiche insieme si è verificato il problema. Quando ho eseguito le specifiche individualmente, hanno superato. Ho incluso quanto segue nel mio spec / spec_helper.rb:

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

Ho aggiunto quanto segue alla prima descrizione in ogni file di specifiche non riuscite. Questo non ha risolto il problema:

before :each do
  sign_out :user
end

Né ha fatto:

after :each do
  sign_out :user
end

Prendendo ispirazione dalla risposta a questa domanda stackover, ho eseguito diverse combinazioni di directory rspec insieme per scoprire quali potrebbero interferire l'una con l'altra. Alla fine ho scoperto che stavo chiamando:

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

quando ho modificato tutte le occorrenze di questo in:

before(:each) do
  :
end

Tutte le specifiche sono passate senza errore:

undefined method `authenticate' for nil:NilClass

Spero che questo sia di aiuto per gli altri.


0

Se stai lavorando con le specifiche di visualizzazione, puoi stub di current_user. Questo sostituisce efficacemente l' current_userhelper chiamato dalla tua vista con tutto ciò che viene restituito. Ecco come con 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

Sembra che ci siano alcuni aggiornamenti al codice sorgente. ApplicationController specifica che deve essere presente unauthenticate_user! filtro prima di qualsiasi richiesta. Questo thread fornisce alcune informazioni sui problemi con esso:

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

In sostanza, il authenticate_user! funzione fa parte di Rails 3 (utilizzando la nuova devisefunzionalità, di cui ne so poco). Se l'app non riesce a trovare il modello utente (a causa di problemi di spazio dei nomi o per qualsiasi motivo), il metodo fallirà. L'applicazione "enki" a cui si è collegati ora è un'applicazione Rails 3. Potrebbe esserci qualche dolore crescente mentre si converte.


2
Questa risposta è pura assurdità al 99% circa.
max

-20

Ruby ti sta dicendo che quel metodo #authenticatenon è ancora stato difeso nil. Puoi farlo facilmente:

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

E l'errore sparirà.


1
per favore non farlo. zero è zero, non è un oggetto valido nel 90% dei casi.
Tiago Peczenyj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.