132 votes

Tous les tests Ruby lèvent : méthode indéfinie `authenticate' pour nil:NilClass

La plupart de mes tests donnent le résultat suivant et je ne comprends pas pourquoi. Toutes les méthodes appellent l'erreur 'authenticate'. J'ai vérifié dans le code s'il existait une méthode appelée "authenticate", mais il n'y en a pas.

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

Le projet peut être trouvé ici => https://github.com/agilepandas/enki au cas où vous voudriez exécuter les tests vous-même.

191voto

Jeffrey W. Points 2167

Cette question a été répondue sur Twitter par @MatthewClosson

@jeffehh Vous devez créer un fichier fichier spec/support/devise.rb comme spécifié ici https://github.com/plataformatec/devise#test-helpers à inclure les aides de test de devise #ruby

Merci encore une fois.

73voto

Tim Fletcher Points 1271

Je suis conscient que vous utilisez Rspec mais vous pouvez rencontrer le même problème avec Test::Unit . Il suffit d'ajouter les aides de test de devise à test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end

8voto

Jonathan Lin Points 2498

La réponse ci-dessus n'a pas fonctionné pour moi (RSpec 3.1).

Ver https://stackoverflow.com/a/21166482/1161743 pour une solution qui a fonctionné pour moi.

Vous devrez déconnecter un utilisateur anonyme avant de configurer les variables :

before :each do
  sign_out :user
end

-3voto

Berin Loritsch Points 3863

Il semble qu'il y ait des mises à jour du code source. L'ApplicationController spécifie qu'il doit y avoir un fichier de type authenticate_user! exécution du filtre avant toute demande. Ce fil de discussion fournit quelques informations sur les problèmes que cela pose :

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

Essentiellement, le authenticate_user! fait partie de Rails 3 (elle utilise la nouvelle fonction devise dont je ne connais pas grand-chose). Si l'application ne trouve pas le modèle User (à cause de problèmes d'espace de noms ou pour toute autre raison), la méthode échouera. L'application "enki" dont vous avez parlé est maintenant une application Rails 3. Il se peut qu'elle connaisse quelques difficultés de croissance lors de la conversion.

-20voto

Boris Stitnicky Points 5409

Ruby vous dit, que la méthode #authenticate n'a pas été défini sur nil encore. Vous pouvez le faire facilement en :

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

Et l'erreur disparaîtra.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X