白黒羊

【C#】NUnitのAssert.EqualをAssert.Thatに置き換える

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