紙一重の積み重ね

アラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【12章】Railsチュートリアルで統合テスト実行時に302: Foundが出る場合の対処法【12.3.3 パスワードの再設定をテストする】

問題

12.3.3 パスワードの再設定をテストするのテスト実行に失敗する。

エラーの原因

PasswordResetsControllerTestで、302エラーが返ってくるため、テストに失敗する。

yokoyan:~/workspace/sample_app (password-reset) $ rails test
Running via Spring preloader in process 4508
Started with run options --seed 23235

 FAIL["test_should_get_edit", PasswordResetsControllerTest, 1.433484478999162]
 test_should_get_edit#PasswordResetsControllerTest (1.43s)
        Expected response to be a <2XX: success>, but was a <302: Found> redirect to <http://www.example.com/>
        test/controllers/password_resets_controller_test.rb:11:in `block in <class:PasswordResetsControllerTest>'

  47/47: [=====================================================================================================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.42694s
47 tests, 205 assertions, 1 failures, 0 errors, 0 skips

根本的な原因

12.1.1 PasswordResetsコントローラにて、作成しなくても良いテストを作成していたため。 (PasswordResetsControllerTestは作成しなくて良いテスト)

以下、実行したコマンド。 「–no-test-framework」と打つべきところを、「–no–test-framework」とタイプしているため、テストケースが作成されてしまっていた。

yokoyan:~/workspace/sample_app (password-reset) $ rails generate controller PasswordResets new edit --no--test-framework
Running via Spring preloader in process 1737
Expected string default value for '--jbuilder'; got true (boolean)
Expected string default value for '--helper'; got true (boolean)
Expected string default value for '--assets'; got true (boolean)
      create  app/controllers/password_resets_controller.rb
       route  get 'password_resets/edit'
       route  get 'password_resets/new'
      invoke  erb
      create    app/views/password_resets
      create    app/views/password_resets/new.html.erb
      create    app/views/password_resets/edit.html.erb
      invoke  test_unit
      create    test/controllers/password_resets_controller_test.rb
      invoke  helper
      create    app/helpers/password_resets_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/password_resets.coffee
      invoke    scss
      create      app/assets/stylesheets/password_resets.scss

対策

不要なテストを消す。

rm test/controllers/password_resets_controller_test.rb

再度テストを実行する

無事に動くようになりました。 めでたしめでたし。

yokoyan:~/workspace/sample_app (password-reset) $ rails test
Running via Spring preloader in process 4725
Started with run options --seed 25295

  45/45: [==================================================================================================] 100% Time: 00:00:02, Time: 00:00:02

Finished in 2.21907s
45 tests, 203 assertions, 0 failures, 0 errors, 0 skips

注意点

一度、rails generateでPasswordResetsControllerTestを作成してしまった後に、 再度正しいオプションで、rails generateをしても、PasswordResetsControllerTestは消えないので注意。むしろ他の必要なファイルがコンフリクトしまくりで被害が拡大。

yokoyan:~/workspace/sample_app (password-reset) $ rails generate controller PasswordResets new edit --no-test-framework
Running via Spring preloader in process 4624
Expected string default value for '--jbuilder'; got true (boolean)
Expected string default value for '--helper'; got true (boolean)
Expected string default value for '--assets'; got true (boolean)
Overwrite /home/ubuntu/workspace/sample_app/app/controllers/password_resets_controller.rb? (enter "h" for help) [Ynaqdh] 
       force  app/controllers/password_resets_controller.rb
       route  get 'password_resets/edit'
       route  get 'password_resets/new'
      invoke  erb
       exist    app/views/password_resets
    conflict    app/views/password_resets/new.html.erb
  Overwrite /home/ubuntu/workspace/sample_app/app/views/password_resets/new.html.erb? (enter "h" for help) [Ynaqdh] n
        skip    app/views/password_resets/new.html.erb
    conflict    app/views/password_resets/edit.html.erb
  Overwrite /home/ubuntu/workspace/sample_app/app/views/password_resets/edit.html.erb? (enter "h" for help) [Ynaqdh] n
        skip    app/views/password_resets/edit.html.erb
      invoke  helper
   identical    app/helpers/password_resets_helper.rb
      invoke  assets
      invoke    coffee
   identical      app/assets/javascripts/password_resets.coffee
      invoke    scss
   identical      app/assets/stylesheets/password_resets.scss