web-dev-qa-db-ja.com

制約ベースのアサートでIsNotNullOrEmptyをアサートするための可読性を向上させます

現在、いくつかのユニットテストを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を使用し続ける必要がありますか?

15

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つの障害条件が重複しないためです。つまり、resultnullであるか、空である可能性がありますが、同時に両方にすることはできません。単一の複合アサーションはこれら2つの状況を区別しないため、デバッガーを使用してresultnullであるか空であるかを確認することになります。

一方、個別のアサーションは、非常に読みやすく、何が起こるかを正確に示します。アサーションごとに1行余分に「コスト」がかかります。これは、潜在的な障害に関するより正確な情報を取得するための妥当なコストだと思います。

18
dasblinkenlight