0

Je suis un débutant Rails qui travaille sur le tutoriel Rails de Michael Hartl et je reçois une erreur que je n'ai aucune idée de comment résoudre. Pour référence, il s'agit de mettre en œuvre les modifications dans la liste 9.24 (https://www.railstutorial.org/book/advanced_login). J'ai ignoré le chapitre 9 (puisqu'il est censé être facultatif) mais au chapitre 10 il demande d'inclure les changements faits dans la liste 9.24, ce que j'ai fait et mes tests échouent toujours.Accéder à la session dans le test d'intégration

C'est l'erreur que je reçois lorsque je lance rails tests

Error: 
UsersEditTest#test_unsuccessful_edit: 
NoMethodError: undefined method `session' for nil:NilClass 
    test/test_helper.rb:18:in `log_in_as' 
    test/integration/users_edit_test.rb:14:in `block in <class:UsersEditTest>' 


bin/rails test test/integration/users_edit_test.rb:12 

E 

Error: 
UsersEditTest#test_successful_edit: 
NoMethodError: undefined method `session' for nil:NilClass 
    test/test_helper.rb:18:in `log_in_as' 
    test/integration/users_edit_test.rb:28:in `block in <class:UsersEditTest>' 

Les tests (test/intégration/users_edit_test.rb) qui échouent sont:

test "successful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
... end 
test "unsuccessful edit" do 
    log_in_as(@user) 
    get edit_user_path(@user) 
... end 

et voici la méthode d'intégration/test_helper qui est appelée

# Log in as a particular user. 
    def log_in_as(user) 
    session[:user_id] = user.id 
    end 

Ce qui est particulièrement déroutant il y a une autre méthode dans l'assistant de test qui utilise également des sessions, et est appelée dans user_login_test qui fonctionne bien.

Toute aide serait grandement appréciée !! La session est uniquement disponible après première demande dans les cas de test.

Répondre

0

Pour le bénéfice de tous ceux qui viennent sur cette question à l'avenir, pour les tests d'intégration, vous aurez besoin de définir une méthode de test_helper que les postes à la les contrôleurs de session créent la méthode, ne modifient pas la session spécifiquement par exemple

class ActionDispatch::IntegrationTest 
    def log_in_as(user, password: 'password') 
     post login_path, params: { session: { email: user.email, password: password} } 
    end 
end 

La raison pour laquelle votre autre méthode de la session fonctionne est parce qu'il ne rien affecter au hachage de la session, juste vérifier si une valeur existe ou non. Pour l'intégration tests, vous ne pouvez pas modifier le hachage de session directement avec la permanence.