0

私は、Michael Hartl's Railsチュートリアルで働いているRailsの初心者です。エラーを受け取りました。修正方法はわかりません。参考までに、これはリスト9.24(https://www.railstutorial.org/book/advanced_login)の変更を実装するためのものです。統合テストでのセッションへのアクセス

私は第9章をスキップしましたが(これはおそらくオプションです)、第10章では、リスト9.24の変更を含めて質問しています。

これは私が実行したときに、私は受け付けており、エラーが失敗している(テスト/統合/ users_edit_test.rbで)テスト

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

テストレールでは、次のとおりです。ここで

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 

と統合された/ test_helperメソッドは、呼び出されている

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

特に混乱しているのは、テストヘルパにはセッションを使用する別のメソッドがあり、うまく動作するuser_login_testで呼び出されます。

ご協力いただければ幸いです!

答えて

0

セッションは、テストケースでの最初の要求後にのみ利用できます。 log_in_as(user)ヘルパーメソッドは、セッションがuser.idで満たされるように、ユーザーを実際にログインさせるリクエストを開始できます。

はこのスレッドでの議論をチェックアウト:将来的にこの問題に出くわす誰の利益のために

https://github.com/rails/rails/issues/23386#issuecomment-192954569

0

を、統合テストのために、あなたはに投稿test_helperメソッドを定義する必要がありますセッションコントローラはメソッドを作成し、セッションを特に変更しない

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

セッションハッシュに何も割り当てていないため、他のセッションメソッドが機能する理由は、値が存在するかどうかだけです。 統合のテストでは、セッションハッシュを永続性で直接変更することはできません。

関連する問題