🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

1155閲覧

rails チュートリアル test fail

dfasdf

総合スコア6

Ruby on Rails

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

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2021/03/26 07:42

編集2021/03/27 00:35

rails チュートリアルの第九章でremember meをテストしていたのですが、下記のエラーが出ています。
エラーコードから、@userに値が入っていないため、@userとcurrent_userがイコールになっていないことが原因だと思うのですが、なぜsetupメソッドで@userに値が入らないのでしょうか。
解決方法がわかりません。
ご教授お願いします。

FAIL["test_current_user_returns_right_user_when_session_is_nil", #<Minitest::Reporters::Suite:0x000055f09692e410 @name="SessionsHelperTest">, 1.2140399210002215] test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (1.21s) --- expected +++ actual @@ -1 +1 @@ -#<User id: 762146111, name: "Michael Example", email: "michael@example.com", created_at: "2021-03-26 07:37:00", updated_at: "2021-03-26 07:37:01", password_digest: [FILTERED], remember_digest: "$2a$04$dcHzfVJ.gK61ZLoozbVqaOR/ZAMvzdtOaTZSTmno7TN..."> +nil test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>'

sessions_helper_test.rb

require 'test_helper' class SessionsHelperTest < ActionView::TestCase def setup @user = users(:michael) remember(@user) end test "current_user returns right user when session is nil" do assert_equal @user, current_user assert is_logged_in? end test "current_user returns nil when remember digest is wrong" do @user.update_attribute(:remember_digest, User.digest(User.new_token)) assert_nil current_user end end

sessions_helper.rb

module SessionsHelper def log_in(user) session[:user_id] = user.id end def remember(user) user.remember cookies.permanent.signed[:user_id] = user.id cookies.permanent[:remember_token] = user.remember_token end def current_user if (user_id = session[:user_id]) @current_user ||= User.find_by(id: user_id) elsif (user_id = cookies.signed[:user_id]) user = User.find_by(id: user_id) if user && user.authenticated?(cookies[:remember_token]) log_in user @current_user = user end end end def logged_in? !current_user.nil? end def forget(user) user.forget cookies.delete(:user_id) cookies.delete(:remember_token) end def log_out forget(current_user) session.delete(:user_id) @current_user = nil end end

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshi_10_11

2021/03/26 10:52

test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>' sessions_helper_test.rbの11行目に問題がある、と記述があるので、とりあえずそのファイルのコードを見せていただけませんか?
dfasdf

2021/03/26 11:47

追記させていただきました。 11行目は assert_equal @user, current_user の部分になります。
guest

回答1

0

ベストアンサー

すみません、うっかりしてました。

このエラーはcurrent_userに原因があるので、このテストコードを書く直前に書いたcurrent_userのコードを確かめてください。

ためしに

ruby

1 test "current_user returns right user when session is nil" do 2 assert_equal @user, 'aaa' 3 assert is_logged_in? 4 end

と書いてみると、

FAIL["test_current_user_returns_right_user_when_session_is_nil", #<Minitest::Reporters::Suite:0x00007f7f0a2b1ca0 @name="SessionsHelperTest">, 0.039250000001629815] test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (0.04s) --- expected +++ actual @@ -1 +1 @@ -#<User id: 762146111, name: "Michael Example", email: "michael@example.com", created_at: "2021-03-26 14:13:15", updated_at: "2021-03-26 14:13:15", password_digest: [FILTERED], remember_digest: "$2a$04$Qv8NBJYhaYdTYNYRqpRSXOimQq37lzGZ.oDbA3q8Io3..."> +"aaa" test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>'

とcurrent_user側の値が期待値と違っていました!とエラー表示されるので、current_userに原因があります!

投稿2021/03/26 14:17

yoshi_10_11

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dfasdf

2021/03/27 00:43

回答ありがとうございます。 current_userに関わるファイルを追記いたしました。 やはり、current_userにはremember(user)メソッドで else if の条件にしっかり当てはまっていると思うのですが、修正箇所ありますでしょうか?
yoshi_10_11

2021/03/27 02:08

current_user確認しましたが、見たところではたしかに問題なさそうですね…であれば次はapp/models/user.rbに定義したrememberメソッドに疑いがかかります。このあたりはなにかコードミスとかテストエラーはありませんか? User.digestやUser.new_tokenにも誤りがないか確認をお願いいたします。 どうしても見つからなければ最終手段として、各ファイルごとにRailsチュートリアルの画面のコードの丸コピペを試していって、エラーが発生しなくなればそのファイルが怪しい、という調べ方もアリかなと思います
dfasdf

2021/03/27 02:16

model/user.rbのファイルでrememberメソッドを、 def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(:remember_token)) end と書いていたため、remember_digestにremember_tokenをハッシュ化した値が入っておらず、current_userメソッドでcookies[:remember_token]と比較した際にfalseになってしまうことが原因でした。そのため、User.digest(:remember_token)の部分を、User.digest(remember_token)と修正することで解決いたしました。 ご教授ありがとうございました!
yoshi_10_11

2021/03/27 02:21

解決できて良かったです!!! 一発で回答できず大変お手数をおかけしました! 今回のように原因の元をたどっていくような調べ方をしていくと、大抵のバグはいずれ解決できますので参考にしてみてください!
dfasdf

2021/03/27 02:26

とんでもないです。 色々な原因を考えるようになったおかげで、様々なコードの意味を深く理解できるようになりました! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問