railsチュートリアル第七章 失敗時のテスト


失敗時のテスト

有効、無効のデータどちらでも正常にアプリが動くようにする。
アプリケーションの変更をするたびにテストを繰り返さなければならず大変である。
Railsではフォーム用のテストを書くことができ、こういったプロセスを自動化することができる。

今回は無効の送信をした時に正しい振る舞いについてテストを書いていく。

新規ユーザー登録用の統合テストを生成する

統合テストのファイル名はusers_signup

rails generate integration_test users_signup

無効なユーザー登録に対するテスト

test/integration/users_signup_test.rb

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  test "invalid signup information" do
    get signup_path
    # signupのページにアクセス
    assert_no_difference 'User.count' do
    # ユーザー数が変わらないかをテストする
      post users_path, params: { user: { name:  "",
                                 # ハッシュのハッシュのようになっているように見える
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
     # postリクエストを送信 フォーム送信をテストする
     # データの投稿した後 assert_no_difference で違いを比べるらしい。
    end
    assert_template 'users/new'
  end
end

テストは、ユーザ数を覚えた後にデータを投稿してみて、ユーザ数が変わらないかどうかを検証するテスト

ubuntu:~/environment/sample_app (sign-up) $ rails t
Running via Spring preloader in process 8623
Started with run options --seed 50070

  20/20: [==============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.38444s
20 tests, 40 assertions, 0 failures, 0 errors, 0 skips

テスト成功

演習

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

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  test "invalid signup information" do
    get signup_path
    # signupのページにアクセス
    assert_no_difference 'User.count' do
    # ユーザー数が変わらないかをテストする
      post users_path, params: { user: { name:  "",
                                 # ハッシュのハッシュのようになっているように見える
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
      # postリクエストを送信 フォーム送信をテストする
      # データの投稿した後 assert_no_difference で違いを比べるらしい。
    end
    assert_template 'users/new'
    assert_select 'div#error_explanation'
    assert_select 'div.alert'
  end
end

ちょっとわからない。 解けなかった。