【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が用意してくれてるはずだ」と分かるようになっていくんでしょうかね.