Komei22 / rails-tutorial

rails-tutorialのsample_app作っていきます
0 stars 0 forks source link

ch7.3.4演習 #46

Closed Komei22 closed 7 years ago

Komei22 commented 7 years ago

演習1

リスト 7.20で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.25にテンプレートを用意しておいたので、参考にしてください。

  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

演習2

未送信のユーザー登録フォームと送信直後のURLは、それぞれ /signup と /users になり、URLが異なっています。これは、リスト 5.43で追加した名前付きルートと、デフォルトのRESTfulなルーティング (リスト 7.3) を設定したことによって生じた差異です。リスト 7.26とリスト 7.27の内容を追加し、この問題を解決してみてください。うまくいけば、いずれのURLも /signup となるはずです。あれ、でもテストは greenのままになっていますね...、なぜでしょうか? (考えてみてください)

変更によって、どちらのURLも/signupになった。 formの送信先が/signupになっているかどうかのテストが書かれていないからテストはGREEN

演習3

リスト 7.25のpost部分を変更して、先ほどの演習課題で作った新しいURL (/signup) に合わせてみましょう。また、テストが greenのままになっている点も確認してください。

変更後のテストもGREEN

11:36:55 - INFO - Running: test/integration/users_signup_test.rb
Started with run options --seed 18673

  1/1: [==============================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.74272s
1 tests, 4 assertions, 0 failures, 0 errors, 0 skips

演習4

リスト 7.27のフォームを以前の状態 (リスト 7.20) に戻してみて、テストがやはり greenになっていることを確認してください。これは問題です! なぜなら、現在postが送信されているURLは正しくないのですから。assert_selectを使ったテストをリスト 7.25に追加し、このバグを検知できるようにしてみましょう (テストを追加して redになれば成功です)。その後、変更後のフォーム (リスト 7.27) に戻してみて、テストが green になることを確認してみましょう。ヒント: フォームから送信してテストするのではなく、’form[action="/signup"]’という部分が存在するかどうかに着目してテストしてみましょう

フォームの状態を元に戻すしてもGREEN

11:38:17 - INFO - Running: test/controllers/users_controller_test.rb test/integration/users_signup_test.rb
Started with run options --seed 30859

  2/2: [==============================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.80965s
2 tests, 5 assertions, 0 failures, 0 errors, 0 skips

assert_select 'form[action="/signup"]'のテストをリスト7.25に追加するとRED

11:42:36 - INFO - Running: test/integration/users_signup_test.rb
Started with run options --seed 29406

 FAIL["test_invalid_signup_information", UsersSignupTest, 0.7836690000258386]
 test_invalid_signup_information#UsersSignupTest (0.78s)
        Expected at least 1 element matching "form[action="/signup"]", found 0..
        Expected 0 to be >= 1.
        test/integration/users_signup_test.rb:16:in `block in <class:UsersSignupTest>'

  1/1: [==============================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.78670s
1 tests, 5 assertions, 1 failures, 0 errors, 0 skips

new.html.erbでform_for(@user, url: signup_path)とすると(フォームの送信先をshignup_pathに変更)テストはGREEN

11:44:41 - INFO - Running: test/controllers/users_controller_test.rb test/integration/users_signup_test.rb
Started with run options --seed 29834

  2/2: [==============================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.79577s
2 tests, 6 assertions, 0 failures, 0 errors, 0 skips