0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まった件

Last updated at Posted at 2022-08-31

Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まったので、備忘録として残します。コードは基本チュートリアルのコピペ通りで、環境もすべてチュートリアルに従っています。

演習内容

フレンドリーフォワーディングで、渡されたURLに初回のみ転送されていることを、テストを書いて確認してみましょう。次回以降のログインのときには、転送先のURLはデフォルト(プロフィール画面)に戻っている必要があります。ヒント: リスト 10.29のsession[:forwarding_url]が正しい値かどうか確認するテストを追加してみましょう。

最初に書いたテスト

users_edit_test.rb
 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

外部サイトの情報をたどると、Nilclassnilオブジェクトに対して、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)

以上で、無事テストが動きました。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?