ruby-on-rails - Tutti i test di Ruby che si sollevano:metodo non definito 'authenticate' per nil:NilClass





testing rspec devise (8)


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 eseguo tutte le specifiche, il problema si è verificato. Quando ho eseguito le specifiche individualmente, sono passate. Ho il seguente incluso nella mia 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 spec in errore. Questo non ha risolto il problema:

before :each do
  sign_out :user
end

Neanche:

after :each do
  sign_out :user
end

Prendendo ispirazione dalla risposta a this domanda di stackoverflow, ho eseguito diverse combinazioni di directory rspec per scoprire quali potrebbero interferire tra loro. Alla fine ho scoperto che stavo chiamando:

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

quando ho cambiato tutte le occorrenze di questo per:

before(:each) do
  :
end

Tutte le specifiche sono passate senza errori:

undefined method `authenticate' for nil:NilClass

Spero che questo aiuti gli altri.

La maggior parte dei miei test sta sollevando quanto segue e non capisco perché. Tutti i metodi richiamano l'errore "autenticarsi". Ho controllato il codice se c'era un metodo chiamato "autenticarsi" ma non esiste un tale metodo.

  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 là => https://github.com/agilepandas/enki nel caso in cui ti piacerebbe eseguire i test da soli.




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

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

Dovrai effettuare il logout di un utente anonimo prima di impostare le variabili:

before :each do
  sign_out :user
end



Ruby ti sta dicendo che il metodo #authenticate non è stato ancora annullato su nil . Puoi farlo facilmente:

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

E l'errore andrà via.




Sembra che ci siano aggiornamenti al codice sorgente. ApplicationController specifica che deve esserci un utente authenticate_user! filtro eseguito prima di qualsiasi richiesta. Questo thread fornisce qualche background su problemi con esso:

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

In sostanza, l'utente authenticate_user! la funzione fa parte di Rails 3 (utilizzando la nuova funzione di devise , di cui conosco poco). Se l'app non riesce a trovare il modello utente (a causa di problemi relativi allo spazio dei nomi o a qualsiasi altro motivo), il metodo avrà esito negativo. L'applicazione "enki" a cui ti sei collegato ora è un'applicazione Rails 3. Potrebbe verificarsi qualche dolore crescente mentre si converte.




Questa domanda ha ricevuto risposta su Twitter da @MatthewClosson

@jeffehh Devi creare un file spec / support / devise.rb come specificato qui https://github.com/plataformatec/devise#test-helpers per includere gli helper test di sviluppo #ruby

Grazie ancora.




in RSpec

come ha detto Jeffrey W., nella sua risposta di cui sopra -> per impostare questo a tutti i controllori:

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

tuttavia, se questo è rilevante per una sola specifica, non è necessario includere gli helper di sviluppo per tutte le specifiche del controller, è possibile includere in modo esplicito quegli helper in quel blocco descrittivo del controller:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end



Sono consapevole che stai usando Rspec ma puoi eseguire lo stesso problema con Test::Unit . Hai solo bisogno di aggiungere gli helper test/test_helper.rb per test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end



Se stai usando le rotaie puoi anche usare in_groups_of :

foo.in_groups_of(3)




ruby-on-rails ruby testing rspec devise