Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まったので、備忘録として残します。コードは基本チュートリアルのコピペ通りで、環境もすべてチュートリアルに従っています。
演習内容
フレンドリーフォワーディングで、渡されたURLに初回のみ転送されていることを、テストを書いて確認してみましょう。次回以降のログインのときには、転送先のURLはデフォルト(プロフィール画面)に戻っている必要があります。ヒント: リスト 10.29のsession[:forwarding_url]が正しい値かどうか確認するテストを追加してみましょう。
最初に書いたテスト
test "successful edit with friendly forwarding" do
#追記前
# get edit_user_path(@user)
# log_in_as(@user)
#追記後
assert_equal session[:forwarding_url], nil ###追記1###
get edit_user_path(@user)
assert_equal session[:forwarding_url], edit_user_path(@user) ###追記2###
log_in_as(@user)
assert_equal session[:forwarding_url], nil ###追記3###
#以下そのまま
assert_redirected_to edit_user_url(@user)
…
end
実行結果は以下です。
"NoMethodError: undefined method `session' for nil:NilClass"と言われました。
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 5963
Started with run options --seed 30229
ERROR["test_successful_edit_with_friendly_forwarding", #<Minitest::Reporters::Suite:0x000055d72bdb00f8 @name="UsersEditTest">, 2.312850365000031]
test_successful_edit_with_friendly_forwarding#UsersEditTest (2.31s)
NoMethodError: NoMethodError: undefined method `session' for nil:NilClass
test/integration/users_edit_test.rb:24:in `block in <class:UsersEditTest>'
34/34: [=========================================================] 100% Time: 00:00:02, Time: 00:00:02
Finished in 2.59835s
34 tests, 84 assertions, 0 failures, 1 errors, 0 skips
上記の追記1のところが良くなかったらしく、エラーが出ていました。
追記3と全く同じコードなのに追記1ではエラーが出て、追記3ではエラーが出ない理由がわかる方いたら教えてほしいです…
追記1,2の間のget edit_user_path(@user)で以下コードが実行されます。この前後でsessionがnilだったりnilじゃなかったり(言語化できない)みたいな感じなのでしょうか。
def store_location
session[:forwarding_url] = request.original_url if request.get?
end
外部サイトの情報をたどると、Nilclass
のnil
オブジェクトに対して、session
メソッドは定義されていない、とのことですが、あまり把握できず…
一旦次に進むとします。
追記1を消したところ、以下のエラーが出ました
ubuntu:~/environment/sample_app (updating-users) $ rails t
Running via Spring preloader in process 6544
Started with run options --seed 36283
session[:forwarding_url] => http://www.example.com/users/762146111/edit3% Time: 00:00:02, ETA: 00:00:01
FAIL["test_successful_edit_with_friendly_forwarding", #<Minitest::Reporters::Suite:0x000055d72a2f2950 @name="UsersEditTest">, 2.0507669390003684]
test_successful_edit_with_friendly_forwarding#UsersEditTest (2.05s)
--- expected
+++ actual
@@ -1 +1 @@
-"http://www.example.com/users/762146111/edit"
+"/users/762146111/edit"
test/integration/users_edit_test.rb:27:in `block in <class:UsersEditTest>'
34/34: [=========================================================] 100% Time: 00:00:02, Time: 00:00:02
Finished in 2.32992s
34 tests, 85 assertions, 1 failures, 0 errors, 0 skips
追記2の比較結果が異なるという結果で、単純に"http://www.example.com/"をつけ忘れているだけでした。
assert_equal session[:forwarding_url], edit_user_path(@user)
↓
assert_equal session[:forwarding_url], http://www.example.com" + edit_user_path(@user)
以上で、無事テストが動きました。