前提・実現したいこと
独学でRails チュートリアル第4版をやっている初心者です。
第8章のログイン機能を実装する部分(リスト 8.23: 有効な情報を使ってユーザーログインをテストする)のテストが通らず困っています。
ブラウザでプレビューする限りだと、ログインやログアウトは正常に動いているように見えます。
基礎的なことで恐縮ですが、ご教授いただけますと幸いです。よろしくお願い致します。
発生している問題・エラーメッセージ
ERROR["test_login_with_valid_information_followed_by_logout", UsersLoginTest, 0.40693422299955273]
test_login_with_valid_information_followed_by_logout#UsersLoginTest (0.41s)
BCrypt::Errors::InvalidHash: BCrypt::Errors::InvalidHash: invalid hash
app/controllers/sessions_controller.rb:8:in 'create'
test/integration/users_login_test.rb:21:in 'block in class:UsersLoginTest'
該当のソースコード
(/sample_app/app/controllers/sessions_controller.rb) class SessionsController < ApplicationController def new end def create user = User.find_by(email: params[:session][:email].downcase) if user && user.authenticate(params[:session][:password]) log_in user redirect_to user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end end def destroy log_out redirect_to root_url end end
(/sample_app/test/integration/users_login_test.rb) require 'test_helper' class UsersLoginTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end test "login with invalid information" do get login_path assert_template 'sessions/new' post login_path, params: { session: { email: "", password: "" } } assert_template 'sessions/new' assert_not flash.empty? get root_path assert flash.empty? end test "login with valid information followed by logout" do get login_path post login_path, params: { session: { email: @user.email, password: 'password' } } assert is_logged_in? assert_redirected_to @user follow_redirect! assert_template 'users/show' assert_select "a[href=?]", login_path, count: 0 assert_select "a[href=?]", logout_path assert_select "a[href=?]", user_path(@user) delete logout_path assert_not is_logged_in? assert_redirected_to root_url assert_select "a[href=?]", login_path assert_select "a[href=?]", logout_path, count: 0 assert_select "a[href=?]", user_path(@user), count: 0 end end
(/sample_app/app/models/user.rb) class User < ApplicationRecord before_save { email.downcase!} validates :name, presence: true, length: { maximum: 50} VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i validates :email, presence: true, length: {maximum: 255}, format: {with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false} has_secure_password validates :password, presence: true, length: { minimum: 6} def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end end
試したこと
"login with valid information followed by logout"
の中の、
post login_path, params: { session: { email: @user.email, password: 'password' } }
を、試しに
post login_path, params: { session: { email: "michael@example.com", password: 'password' } }
としてもだめでした。
補足情報(FW/ツールのバージョンなど)
AWS Cloud9を使用しています。
RailsのバージョンなどはRailsチュートリアルの指示通りやっているつもりです。
source 'https://rubygems.org' gem 'rails', '5.1.6' gem 'bcrypt', '3.1.12' gem 'puma', '3.9.1' gem 'sass-rails', '5.0.6' gem 'uglifier', '3.2.0' gem 'coffee-rails', '4.2.2' gem 'jquery-rails', '4.3.1' gem 'turbolinks', '5.0.1' gem 'jbuilder', '2.7.0' gem 'bootstrap-sass', '3.3.7' group :development, :test do gem 'sqlite3', '1.3.13' gem 'byebug', '9.0.6', platform: :mri end group :development do gem 'web-console', '3.5.1' gem 'listen', '3.1.5' gem 'spring', '2.0.2' gem 'spring-watcher-listen', '2.0.1' end group :test do gem 'rails-controller-testing', '1.0.2' gem 'minitest', '5.10.3' gem 'minitest-reporters', '1.1.14' gem 'guard', '2.13.0' gem 'guard-minitest', '2.4.4' end group :production do gem 'pg', '0.20.0' end # Windows環境ではtzinfo-dataというgemを含める必要があります gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/04/02 23:03
2020/04/02 23:05