ぞえの技術めも

Ruby on Rails勉強中

【62日目】【1日20分のRailsチュートリアル】【第7章】ユーザー登録失敗時のテストを生成する

Ruby on Railsチュートリアル(第3版)

今日は「7.3.4 失敗時のテスト」から。

7.3.4 失敗時のテスト

Railsではフォーム用のテストを書くことができ、こういったプロセスを自動化することができます。
本項では、無効な送信をしたときの正しい振る舞いについてテストを書いていきます。

テストを自動化って素晴らしいよね…。自分で色んなパターンを考えて試験だなんてめんどくさいし漏れが出てきそう。。。

まずは、新規ユーザー登録用の統合テストを生成するところから始めていきます。

テストを新しく生成。

$ rails generate integration_test users_signup
      invoke  test_unit
      create    test/integration/users_signup_test.rb

このテストでは、ユーザー登録ボタンを押したときに (ユーザー情報が無効であるために) ユーザーが作成されないことを確認します。

現在のユーザーが0なことを確認。

$ rails console
>> User.count
=> 0

フォーム送信をテストするためには、 users_pathに対してPOSTリクエストを送信する必要があります (表7.1)。

POSTリクエストを送信するテストを書くんですね。

test/integration/users_signup_test.rb

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, user: { name:  "",
                               email: "user@invalid",
                               password:              "foo",
                               password_confirmation: "bar" }
    end
    assert_template 'users/new'
  end
end

assert_no_differenceメソッドのブロック内でpost関数を使い、メソッドの引数には’User.count’を与えています。
これは、 assert_no_differenceのブロックを実行する前後で引数の値 (User.count) が変わらないことをテストしています。

もしユーザー数が増えたらテスト失敗、ってことかな。
無効なユーザーを登録しようとしているからユーザーは増えない、ってことか。

すでに無効なユーザー登録が失敗する作りになっているのでテストは成功する。

$ bundle exec rake test
20 tests, 41 assertions, 0 failures, 0 errors, 0 skips

今日の作業時間は【20分】

次は「7.4 ユーザー登録成功」から。