質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

解決済

Rails tutorialの8章においてテストスイートが上手くいかない

yonamine
yonamine

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1回答

0リアクション

0クリップ

134閲覧

投稿2019/01/21 14:54

編集2019/01/21 15:38

session_controller.rb

ruby

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 params[:session][:remember_me] == '1' ? remember(user) : forget(user) remember user redirect_to user else flash.now[:danger] = "Invalid email/password combination" render "new" end end def destroy log_out if logged_in? redirect_to root_url end end

test_helpr.rb

ruby

ENV['RAILS_ENV'] ||= 'test' require_relative '../config/environment' require 'rails/test_help' require "minitest/reporters" Minitest::Reporters.use! class ActiveSupport::TestCase fixtures :all # テストユーザーがログイン中の場合にtrueを返す def is_logged_in? !session[:user_id].nil? end # テストユーザーとしてログインする def log_in_as(user, options = {}) password = options[:password] || 'password' remember_me = options[:remember_me] || '1' if integration_test? post login_path, params: {session: { email: user.email, password: password, remember_me: remember_me }} else session[:user_id] = user.id end end private # 統合テスト内ではtrueを返す def integration_test? defined?(post_via_redirect) end end

users_login_test.rb

ruby

require 'test_helper' class UsersLoginTest < ActionDispatch::IntegrationTest 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 def setup @user = users(:michael) 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 # 2番目のウィンドウでログアウトをクリックするユーザーをシミュレートする delete logout_path follow_redirect! assert_select "a[href=?]", login_path assert_select "a[href=?]", logout_path, count: 0 assert_select "a[href=?]", user_path(@user), count: 0 end test "login with remembering" do log_in_as(@user, remember_me: '1') assert_not_nil cookies['remember_token'] end test "login without remembering" do log_in_as(@user, remember_me: '0') assert_nil cookies["remember_token"] end end

user.rb

ruby

class User < ApplicationRecord attr_accessor :remember_token before_save {self.email = email.downcase} validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[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} mount_uploader :image, ImageUploader # 与えられた文字列のハッシュ値を返す def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end def User.new_token SecureRandom.urlsafe_base64 end def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end def authenticated?(remember_token) return false if remember_digest.nil? BCrypt::Password.new(remember_digest).is_password?(remember_token) end # ユーザーログインを破棄する def forget update_attribute(:remember_digest, nil) end end

Rails tutorialの8章でremember_me機能のテストを実行しているのですが以下の写真のように上手くいきません。
イメージ説明
これは上記に添付したusers_login_test.rbにおいてassert_nil cookies["remember_token"]の中の値がnilになることを求めているのですが、nilになっていません。
チュートリアルによると、ここまででテストは成功する事になっています。
なんどコードを確認してもRails tutorialに記載されているのと同じように見えます。
それとも自分が見落としていて、どこかおかしなコードがあるのでしょうか?
ストレスで夢の中でmacを破壊していました
どなたかご教授頂けたら非常に嬉しいです。
参考までにRails tutorial8章のリンクを以下に添付いたします。
リンク内容

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

asm

2019/01/21 15:28

app/controllers/sessions_controller.rb はどうなっていますか? また、単なる興味ですが・・・ Rails4.2版を用いているのには何か理由があるのでしょうか?
yonamine

2019/01/21 15:41

コメントありがとうございます! sessions_controller.rbを追加いたしました。 今ターミナルで確認したところ自分が使っているバージョンはRails 5.2.2と表記されました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。