Assert.Thatを使おう
Assert.Equal
とか、Assert.True
の方が文字数が少なく書けるので何となく使っていなかったのですが、こちらの方が新しく(と言っても多分10年ぐらい前からある)、機能が色々と追加されて可読性も高いようなので Assert.That
を使うことにしました。
Assert.That(a, Is.LessThan(b));
こう書くと、A is less than B (AはBよりも小さい) という普通の文章として読めます。どっちが大きくてどっちが小さいのか一目瞭然!
Assert.That(foo, Is.True); // fooがtrueである Assert.That(length, Is.EqualTo(10).Within(1)); // lengthが9-11の間である Assert.That(text, Is.Empty); // textは空文字列である
……みたいな感じで書けます
Assert.Equal からの移行
まずは今まで Assert.Equal
で書いていたところを全部置き換えようと思います。
IDEの置換で正規表現をオンにした状態で、以下の文字列を入力して実行します。
Find: Assert\.AreEqual\((?<expected>.*), (?<actual>.*)\);
Replace: Assert.That(${expected}, Is.EqualTo(${actual});
これですべて Assert.That
になってくれました。
完全に余談ですが、この正規表現を用いた置換はちょっとした仕様変更などに使えてとても便利です。\u${name}
で一文字目を大文字にしたり、スプレッドシートからコピーしてきたデータを以下のように JsonProperty
に変換するだとかで使います。
Find: (?<name>\w+)[\s\n\r]
Replace: [JsonProperty("${name}")] private readonly string _${name};\n
浮動小数点の比較
FloatEqualityComparer.Instance
を使うとデフォルトでは 0.0001
までの値が誤差として許容されます。
Assert.That(width, Is.EqualTo(10.5f).Using(FloatEqualityComparer.Instance)); Assert.That(width, Is.EqualTo(10.5f).Using(new FloatEqualityComparer(0.000001f));
参考リンク
NUnitのAssert.ThatメソッドにIsとかHasとかを入れて柔軟なテストコードを書こう – Qiita