はじめに
11.3.3のうち演習3のテストコード作成のみ記載しています。
これまでのテストコードを書く演習では、多少なりともコードの雛形が用意されていたが、今回はコードについてはノーヒントだったので、結構悩みました。
演習内容
ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。
訳注: updateメソッドは、コールバックとバリデーションを実行せずにスキップしますので、コールバックやバリデーションをかける必要がある場合は注意が必要です。
解答
/users に対するテスト ⇨ green
/users
(ユーザ一覧を表示するindex画面)、には有効化されていない(activated:false
)のユーザが表示されないことを確認する。
まず、現状のtest用に作成したユーザ一覧は全て有効化されているため、(activated:false
)のユーザを追加する。
ghost:
name: Ghost Example
email: ghost@example.com
password_digest: <%= User.digest('password') %>
activated: false #defaultでfalseなので、記載不要だが他との違いを明確にするため記載
activated_at: nil
・・・
次に、一覧画面上に上記の有効化されていないユーザは表示されないことを、テストコードに追加。一覧画面のa
タグに有効化されたユーザの名前は存在するが、有効化されていないユーザはないことを検証しています。
def setup
@admin = users(:michael)
@non_admin = users(:archer)
@activated = users(:archer) #今回追加
@non_activated = users(:ghost) #今回追加
end
test "index includes only activated user" do
log_in_as(@activated)
get users_path
assert_template 'users/index'
assert_select 'a',text: @non_activated.name, count:0
assert_select 'a',text: @activated.name, count:1
end
/users/:id に対するテスト ⇨ green
演習1で、仕様変更を行った、有効化されていないユーザ(activated:false
)のユーザプロフィール画面(/users/:id
)を指定した場合には、プロフィール表示を行わず、ルート画面へリダイレクトされること検証する。
逆説的に、有効化されているユーザのユーザプロフィール画面を指定した場合には、ただしくプロフィール表示が行われることもセットで検証
どのテストファイルで実施するか迷ったが、controllerの挙動を確認するという意味でusers_controller_test.rb
に追加することにした。
def setup
@user = users(:michael)
@other_user = users(:archer)
@non_activated = users(:ghost)
end
# 途中略
test "should redirect to root when get non_activated user_path" do
log_in_as(@user)
get user_path(@non_activated)
assert_redirected_to root_url
end
test "should show user when get activated user_path" do
log_in_as(@user)
get user_path(@other_user)
assert_template 'users/show'
end
終わりに
テストコードを書いてみたが、演習に記載された以下の訳注が何を意味するのかは理解できなかった。もしご存じの方いれば、コメントお願いします。
訳注: updateメソッドは、コールバックとバリデーションを実行せずにスキップしますので、コールバックやバリデーションをかける必要がある場合は注意が必要です。