現在、いくつかのユニットテストをNUnit2ではなくNUnit3を使用するように書き直しており、いくつかのアサーションを制約ベースのアサーションに変更する必要があります。私は次の主張をしています:
Assert.IsNullOrEmpty(result);
私が変更したもの:
Assert.That(result, Is.Null.Or.Empty);
ただし、IsNotNullOrEmpty
をアサートするときの読みやすさに完全に満足しているわけではありません。
Assert.That(result, Is.Not.Null.And.Not.Empty);
私の現在の提案は、次の静的クラスを作成することです。
public static class Text
{
public static EmptyConstraint IsNullOrEmpty => Is.Null.Or.Empty;
public static EmptyConstraint IsNotNullOrEmpty => Is.Not.Null.And.Not.Empty;
}
使用法:
Assert.That(result, Text.IsNotNullOrEmpty);
これにより、カスタム制約が導入される代わりに、読みやすさが向上します。同じアサーションを作成する標準的な方法はありますか、それとも代わりにIs.Not.Null.And.Not.Empty
を使用し続ける必要がありますか?
Is.Null.Or.Empty
に対するアサーションは、Test
クラスがなくても完全に正常に読み取られます。さらに、このアサーションが失敗すると、何が起こったのかが正確にわかります。空ではない有効なstring
オブジェクトがあります。
「ド・モルガン化」バージョンの否定、つまりIs.Not.Null.And.Not.Empty
で見られる問題は、長すぎて、Is.Null.Or.Empty
ほどうまく読み取れないことです。
ただし、個別の制約を作成するのではなく、その部分を個別にアサートします。
Assert.That(result, Is.Not.Null);
Assert.That(result, Is.Not.Empty);
私がそのようにする理由は、2つの障害条件が重複しないためです。つまり、result
はnull
であるか、空である可能性がありますが、同時に両方にすることはできません。単一の複合アサーションはこれら2つの状況を区別しないため、デバッガーを使用してresult
がnull
であるか空であるかを確認することになります。
一方、個別のアサーションは、非常に読みやすく、何が起こるかを正確に示します。アサーションごとに1行余分に「コスト」がかかります。これは、潜在的な障害に関するより正確な情報を取得するための妥当なコストだと思います。