【Rails5】assert_differenceで複数の値をチェックする

概要

特定の処理の前後における数値の増減をテストしたいことはよくあります. 例えばPOSTリクエストの前後でUserが増加するテストなどです.

これをテストするにはassert_differenceというメソッドを使い, 次のように書けばいいですね.

assert_difference 'User.count', 1 do
  post users_path, params: { user: { name: "foo" } }
end

では一つの処理に対して複数の値をチェックしたい場合はどうすればよいでしょうか. 実はこれもassert_differenceでテストすることができます.

テストの書き方

詳しくは公式ドキュメントを参照してもらうことにして, ここでは2つのケースを考えてみます.

チェックする値は複数あるが, 増減幅は一緒の場合

例えば記事Articleを1つ投稿すると通知Notificationも1つだけ送られる場合を考えます. このときは以下のように書けばよいでしょう.

assert_difference [ 'Article.count', 'Notification.count' ], 1 do
  # 記事を投稿する処理
end

チェックする値が複数あり, それぞれ増減幅が異なる場合

例えば記事Articleを1つ投稿しつつ, 新たにタグTagを2つ作成する場合を考えます. このときは以下のようにテストを書くことができます.

assert_difference ->{ Article.count } => 1, ->{ Tag.count } => 2 do
  # 記事を投稿する処理
end

ラムダを使った特殊な記法ですね.

ひとこと

あったらいいのになーと思う機能があったりなかったり. もっとRailsを理解していけば, 「こんな機能はRailsが用意してくれてるはずだ」と分かるようになっていくんでしょうかね.