2010-11-30 3 views
3

Après avoir terminé la liste Listing 10.40 et en cours d'exécution /spec/controllers/users_controller_spec.rb rspec, je suis 1 échec de la section (tous les autres tests dans la section 'détruire' sont passés)Ruby on Rails section Tutoriel 10.4.2 échec du test

describe "DELETE 'destroy'" do 

    before(:each) do 
    @user = Factory(:user) 
    end 

    describe "as a non-signed-in user" do 
    it "should deny access" do 
     delete :destroy, :id => @user 
     response.should redirect_to(signin_path) 
    end 
    end 
end 

est ici la sortie de la console:

Failures: 
    1) UsersController DELETE 'destroy' as a non-signed-in user should deny access 
    Failure/Error: delete :destroy, :id => @user 
    undefined method `admin?' for nil:NilClass 
    # ./app/controllers/users_controller.rb:66:in `admin_user' 
    # ./spec/controllers/users_controller_spec.rb:282:in `block (4 levels) in <top (required)>' 

je ne peux pas savoir s'il y a une erreur dans le code du tutoriel ou je fait une erreur quelque part.

Répondre

3

ne peut pas dire à coup sûr, mais il semble que c'est la partie du code de tutoriel qui est à défaut

<% if current_user.admin? %> 

Si personne est signé sur cette page, current_user est nulle (je suppose) et, par conséquent ne peut pas avoir une méthode admin? appelée.

Essayez de remplacer que par

<% if current_user && current_user.admin? %> 

(et remplacer une autre logique current_user sur la page de la même).

Est-ce que cela fonctionne?

De même, si vous commentez ce test, fait-il le même test avec un mot de passe utilisateur connecté?


Après avoir examiné de plus près, ne pas tenir compte de ce qui précède: le test est un échec parce que, dans le vrai style TDD le test est écrit avant le code. Sot les étapes sont les suivantes:

  1. Ecrire le test
  2. Regardez échouer
  3. Recopiez le code pour faire passer de test
  4. Regardez le test de passage

Vous n'êtes pas encore écrit le code à vérifier est un utilisateur est admin. Ecrire le code dans la section Listing 10.41 dans le tutoriel, et le test devrait passer.

Cependant, il peut être nécessaire de mettre

def admin_user 
    redirect_to(root_path) unless current_user && current_user.admin? 
end 

Dans le filtre avant (avis, nous vérifions un current_user avant de voir s'il est un admin).

+0

Pouvez-vous s'il vous plaît préciser où exactement je le remplacer, ce contrôleur, modèle ...? Si je commente ce test, tout le reste est vert. –

+0

Essayez la solution modifiée. Espérons que cela l'efface? –

+0

Oui, je comprends le principe TDD, j'ai juste omis toutes les autres sections de spécification dans ma question, désolé si cela vous a rendu confus. J'ai ajouté le contrôle 'current_user' et maintenant cette partie semble fonctionner. Mais j'ai une autre erreur dans la ligne 'response.should redirect_to (signin_path)'. Pour une raison quelconque, il y a en fait une redirection vers 'root_path' et la dernière ligne de la méthode' destroy' du contrôleur 'user' est' redirect_to users_path'. J'ai dû louper quelque chose. –

5

Je crois que les lecteurs qui rencontrent ce problème manquent simplement la méthode :destroy dans le :authenticate avant le filtre introduit dans Listing 10.11. (Note: Je suis l'auteur du livre.)

+1

Voir la première ligne du [Listing 10.41] (http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#code : admin_destroy_before_filter) pour le filtre complet. –

1

Je lisais ce tutoriel et j'ai aussi rencontré ce test qui échouait.

Vérifiez si vous avez:

before_filter :authenticate, :only => [:index, :edit, :update, :destroy]

au lieu de:

before_filter :authenticate, :only => [:index, :edit, :update]

dans users_controller.rb