問題
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