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
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
演習1
リスト 7.20で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.25にテンプレートを用意しておいたので、参考にしてください。
演習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
演習4
リスト 7.27のフォームを以前の状態 (リスト 7.20) に戻してみて、テストがやはり greenになっていることを確認してください。これは問題です! なぜなら、現在postが送信されているURLは正しくないのですから。assert_selectを使ったテストをリスト 7.25に追加し、このバグを検知できるようにしてみましょう (テストを追加して redになれば成功です)。その後、変更後のフォーム (リスト 7.27) に戻してみて、テストが green になることを確認してみましょう。ヒント: フォームから送信してテストするのではなく、’form[action="/signup"]’という部分が存在するかどうかに着目してテストしてみましょう
フォームの状態を元に戻すしてもGREEN
assert_select 'form[action="/signup"]'のテストをリスト7.25に追加するとRED
new.html.erbで
form_for(@user, url: signup_path)
とすると(フォームの送信先をshignup_pathに変更)テストはGREEN