🕵️‍♂️

assert_not_includesに気をつけろ!

2023/12/21に公開

minitestの話です。

先日とある不具合が発生し、流出原因を確認していました。
ちゃんとケースは存在したのですが、内容が不十分で流出してしまっていました。

流出原因: assert_not_includes だけで検証していた

assert_not_includesの仕様として、以下の検証はすべてパスします。

test "hoge" do
  assert_not_includes [], 1
  assert_not_includes [nil], 1
  assert_not_includes [1], nil
end

「まぁそりゃそうだろう」とは思いますが、データがこうなっている時点でロジックが壊れている可能性が高いので、テストは失敗してほしいところです。
ちなみに今回はassert_not_includes [1], nilの状態でした。

対策

テストで否定的検証をしたいときは発生し得るデータ状態を考慮した上で、多少わざとらしくてもかならず肯定的検証をセットで使うようにしたほうがよいなと思いました。
たとえばこんな感じ。

test "hoge" do
  # 何らかの処理
  assert fuga.present?
  assert_not_includes hoge, fuga
end
wwwave's Techblog

Discussion