2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails チュートリアル 5.0(第4版)演習と解答(11.3.3)

Posted at

はじめに

11.3.3のうち演習3のテストコード作成のみ記載しています。
これまでのテストコードを書く演習では、多少なりともコードの雛形が用意されていたが、今回はコードについてはノーヒントだったので、結構悩みました。

演習内容

ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。
訳注: updateメソッドは、コールバックとバリデーションを実行せずにスキップしますので、コールバックやバリデーションをかける必要がある場合は注意が必要です。

解答

/users に対するテスト ⇨ green

/users(ユーザ一覧を表示するindex画面)、には有効化されていない(activated:false)のユーザが表示されないことを確認する。
まず、現状のtest用に作成したユーザ一覧は全て有効化されているため、(activated:false)のユーザを追加する。

users.yml
ghost:
  name: Ghost Example
  email: ghost@example.com
  password_digest: <%= User.digest('password') %>
  activated: false   #defaultでfalseなので、記載不要だが他との違いを明確にするため記載
  activated_at: nil

    ・・・

次に、一覧画面上に上記の有効化されていないユーザは表示されないことを、テストコードに追加。一覧画面のaタグに有効化されたユーザの名前は存在するが、有効化されていないユーザはないことを検証しています。

users_index_test.rb
  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に追加することにした。

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メソッドは、コールバックとバリデーションを実行せずにスキップしますので、コールバックやバリデーションをかける必要がある場合は注意が必要です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?