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

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

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

TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

Ruby on Rails 5

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

Ruby

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

Q&A

解決済

1回答

3453閲覧

Rails Tutorial10章 10.32のテストが通りません

takuma-yoshida

総合スコア11

TestNG

TestNGは、Javaのためのテスティングフレームワーク。JUnitとNUnitにインスパイアを受け開発されました。ユニットテストに限らず、機能テストや統合テストも行うことが可能です。

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/08/14 22:19

皆さん、こんにちは。
Rails Tutorial第4版、10章を学習しています。
【リスト 10.28: 最終的なcorrect_userの実装】までテストが通るんですが
【リスト 10.33】のテストが通りません。

どなたか分かる方ご教示頂けますか?

以下がテストの結果です。

xxxxxxxxxxxxxxxxxxxxxxxxxxx:sample_app xxxxxxxxx$ bundle exec rake test DEPRECATION WARNING: Sprockets method `register_engine` is deprecated. Please register a mime type using `register_mime_type` then use `register_compressor` or `register_transformer`. https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md#supporting-all-versions-of-sprockets-in-processors (called from block (2 levels) in <class:Railtie> at /Users/xxxxxxxxx/.rvm/gems/ruby-2.2.5/gems/sass-rails-5.0.2/lib/sass/rails/railtie.rb:57) DEPRECATION WARNING: Sprockets method `register_engine` is deprecated. Please register a mime type using `register_mime_type` then use `register_compressor` or `register_transformer`. https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md#supporting-all-versions-of-sprockets-in-processors (called from block (2 levels) in <class:Railtie> at /Users/xxxxxxxxx/.rvm/gems/ruby-2.2.5/gems/sass-rails-5.0.2/lib/sass/rails/railtie.rb:58) Run options: --seed 10105 # Running: ..................F..............DEPRECATION WARNING: The assertion was not run because of an invalid css selector. unexpected '$' after '[:equal, "\"/login\""]' (called from block in <class:UsersLoginTest> at /Users/xxxxxxxxx/workspace/sample_app/test/integration/users_login_test.rb:34) DEPRECATION WARNING: The assertion was not run because of an invalid css selector. unexpected '$' after '[:equal, "\"/logout\""]' (called from block in <class:UsersLoginTest> at /Users/xxxxxxxxx/workspace/sample_app/test/integration/users_login_test.rb:35) DEPRECATION WARNING: The assertion was not run because of an invalid css selector. unexpected '$' after '[:equal, "\"/users/762146111\""]' (called from block in <class:UsersLoginTest> at /Users/xxxxxxxxx/workspace/sample_app/test/integration/users_login_test.rb:36) ... Finished in 1.560245s, 23.0733 runs/s, 76.9110 assertions/s. 1) Failure: UsersSignupTest#test_valid_signup_information_with_account_activation [/Users/xxxxxxxxx/workspace/sample_app/test/integration/users_signup_test.rb:41]: expecting <"user/show"> but rendering with <["users/show", "layouts/_shim", "layouts/_header", "layouts/_footer", "layouts/application"]> 36 runs, 120 assertions, 1 failures, 0 errors, 0 skips Time: 00:00:00, ETA: 00:00:0 ERROR["test_login_with_remembering", Minitest::Result,01947229891084] test_login_with_remembering#Minitest::Result (0.53s) NoMethodError: NoMethodError: undefined method `remember_token' for nil:NilClass test/integration/users_login_test.rb:45:in `block in <class:UsersLoginTest>' E 35/2: [=======] 5% Time: 00:00:00, ETA: 00:00:09 Error: UsersLoginTest#test_login_with_remembering: NoMethodError: undefined method `remember_token' for nil:NilClass test/integration/users_login_test.rb:45:in `block in <class:UsersLoginTest>'

以下がエラーが記載しているファイルの場所です。

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 # 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_equal cookies['remember_token'], assigns(:user).remember_token end test "login without remembering" do # クッキーを保存してログイン log_in_as(@user, remember_me: '1') delete logout_path # クッキーを削除してログイン log_in_as(@user, remember_me: '0') assert_empty cookies['remember_token'] end end

以下が実行環境になります。

Running via Spring preloader in process 1739 About your application's environment Rails version 5.1.4 Ruby version 2.4.0-p0 (x86_64-linux) RubyGems version 2.6.8 Rack version 2.0.5 JavaScript Runtime Node.js (V8) Middleware Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, Rack::Head, Rack::ConditionalGet, Rack::ETag Environment development Database adapter sqlite3 Database schema version 20180813205653

以上です、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題は2つ出ています。

  • test/integration/users_signup_test.rb:41行目のassert_template 'user/show'assert_template 'users/show'のtypoの可能性がある。
  • app/controllers/sessions_controller.rbのcreateメソッドがないと分からんが

SessionsController#create内で@usernilっぽい

投稿2018/08/14 22:50

asm

総合スコア15147

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

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

takuma-yoshida

2018/08/15 05:56

コメントありがとうございます。 assert_template 'users/show'にはなってました。 他に原因がるとしたらコントローラ系でしょうか?
asm

2018/08/15 06:59

そうですね。回答に書いた2つのファイルについての詳細がないとコレ以上はなんとも言えません。 (railsチュートリアルのバグでassert_selectが実はrails4.2以降で実行されないっぽいですが)
takuma-yoshida

2018/08/15 07:04

ファイルの詳細なんですが意見をいただけないでしょうか? 【test/integration/users_signup_test】 require 'test_helper' class UsersSignupTest < ActionDispatch::IntegrationTest test "invalid signup information" do get signup_path assert_no_difference 'User.count' do post users_path, params: { user: { name: "", email: "user@invalid", password: "foo", password_confirmation: "bar" } } end assert_template 'users/new' assert_select 'div#error_explanation' assert_select 'div.alert' end test "valid signup information" do get signup_path assert_difference 'User.count', 1 do post users_path, params: { user: { name: "Example User", email: "user@example.com", password: "password", password_confirmation: "password" } } end follow_redirect! assert_template 'users/show' assert_not flash.empty? assert is_logged_in? end end
takuma-yoshida

2018/08/15 07:05

【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 params[:session][:remember_me] == '1' ? remember(user) : forget(user) redirect_back_or 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
asm

2018/08/15 07:13 編集

前者【test/integration/users_signup_test】については見てるファイルが違うような気がします test "valid signup information with account activation" があるハズ 後者【app/controllers/sessions_controller.rb】については create 内のローカル変数userをインスタンス変数@userに書き換え
takuma-yoshida

2018/08/15 07:19 編集

valid signup information with account activationはファイル名でしょうか? 後者は params[:session][:remember_me] == '1' ? remember(user) : forget(user) ↓ params[:session][:remember_me] == '1' ? remember(@user) : forget(@user) でいいんでしょうか?
asm

2018/08/15 07:32 編集

テストケースの名前です。 ファイルの内容として書かれてるハズです。 --- 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) redirect_back_or @user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end です なぜ、そうするかという話はhttps://railstutorial.jp/chapters/advanced_login?version=5.1#sec-exercises_testing_the_remember_me_box にてされています。
takuma-yoshida

2018/08/15 07:34

すいません、知識不足で申し訳ないんですがテストケースについて教えていただけますか?
takuma-yoshida

2018/08/15 07:42

ありがとうございます、そちらみてみます。
asm

2018/08/15 07:43

提示された【test/integration/users_signup_test】内に test "valid signup information" do なんとか end という部分があるじゃない、これが"valid signup information"という名前の付いたテストケースです。 んで、エラーメッセージをみると UsersSignupTest#test_valid_signup_information_with_account_activation [/Users/xxxxxxxxx/workspace/sample_app/test/integration/users_signup_test.rb:41]: と、書いてありますので test "valid signup information with account activation" do という行がファイル内にあるはずで、'user/show' の打ち間違いがその中にあるはず という推理です
takuma-yoshida

2018/08/15 08:12

【sample_app/test/integration/users_signup_test.rb】 require 'test_helper' class UsersSignupTest < ActionDispatch::IntegrationTest test "invalid signup information" do get signup_path assert_no_difference 'User.count' do post users_path, params: { user: { name: "", email: "user@invalid", password: "foo", password_confirmation: "bar" } } end assert_template 'users/new' assert_select 'div#error_explanation' assert_select 'div.alert' end test "valid signup information" do get signup_path assert_difference 'User.count', 1 do post users_path, params: { user: { name: "Example User", email: "user@example.com", password: "password", password_confirmation: "password" } } end follow_redirect! assert_template 'users/show' ←※おそらくこの部分だと思うんですが assert_not flash.empty? assert is_logged_in? end end
asm

2018/08/15 09:59

なぜかはわかりませんが、そこは無関係です。 とりあえず、'user/show'については、おいといて NoMethodError: NoMethodError: undefined method `remember_token' for nil:NilClass については解消しましたか?
takuma-yoshida

2018/08/15 10:06 編集

いいえ、まだ解決できていないです。 NoMethodError: NoMethodError: undefined method `remember_token' for nil:NilClass メソッドのなんのエラーなのか理解できていなくて調べているんですがなかなか進まないですね。
asm

2018/08/15 10:26

test/integration/users_login_test.rbの assigns(:user).remember_token という部分が問題で、assigns(:user)でSessionControllerの@user変数を取れるのですが SessionController#createで@userへの代入を行っていなかった為nilになってしまうのが問題です。 よって↑の方で記した改変を行えばこのエラーは消えるはずですよ
takuma-yoshida

2018/08/15 10:39

【app/controllers/sessions_controller.rb】 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) redirect_back_or user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end 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) redirect_back_or @user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end end 出来ました!! 上記に変更したらテストを無事通りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問