17

現在、NUnit 2 の代わりに NUnit 3 を使用するようにいくつかの単体テストを書き直しており、いくつかのアサートを制約ベースのアサートに変更する必要があります。私は次の主張を持っています:

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代わりに使用し続ける必要がありますか?

4

1 に答える 1

21

あなたのアサーションはIs.Null.Or.Empty、クラスがなくても完全に問題なく読み取りますTest。さらに、このアサーションが失敗すると、何が起こったのか正確にわかりますstring。つまり、空ではない有効なオブジェクトを取得したことになります。

その否定の「DeMorgan 化された」バージョンで見られる問題は、Is.Not.Null.And.Not.Empty長すぎることと、実際ほどうまく読めないことIs.Null.Or.Emptyです。

ただし、それに対して個別の制約を作成するのではなく、その部分を個別に主張します。

Assert.That(result, Is.Not.Null);
Assert.That(result, Is.Not.Empty);

result私がそのようにする理由は、2 つの失敗条件が重ならないためnullです。単一の複合アサーションでは、これら 2 つの状況を区別できないため、最終的にデバッガーを使用して、resultあったnullか空であるかを確認することになります。

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

于 2016-04-07T16:35:56.453 に答える