7

現在、xUnit、Moq、および AutoFixture を使用してドメイン プロジェクトの単体テストを作成しています。このテスト方法を見てみましょう。

[Theory]
public void SameValueAs_OnOtherHasDifferentEmail_ReturnsFalse()
{
    Fixture fix = new Fixture();
    var sut = fix.CreateAnonymous<CoreAddress>();

    var other = new CoreAddress(
        sut.Firstname,
        sut.Lastname,
        sut.Company,
        sut.Street,
        sut.City,
        sut.ZIP,
        "other@email.com");

    Assert.False(sut.SameValueAs(other));
}

ご覧のとおり、クラス CoreAddress とその SameValueAs メソッドをテストしています。考えられるすべてのケースをテストするには、 Test メソッドOnOtherHasDifferentFirstnameOnOtherHasDifferentLastnameなどを作成する必要があります。このパターンは大丈夫ですか? AutoFixture の使用に関して、これを単純化できますか?

4

2 に答える 2

8

そのアプローチは、私が自分で行うことと非常によく似ています。ほとんどすべての自動化されたテストは、実際の結果が期待される結果と等しいかどうかをテストすることを中心に展開されていることを考えると、人々が同等性自体を単体テストしたくない理由がまったくわかりませんでした。

上記のような値オブジェクトを使用すると、非常によく似た多くのテストが発生するため、簡単に少し面倒になる可能性があります。

xUnit.net で使用できる 1 つのハックは次のとおりです。

[Theory]
[InlineData("other first name", null, null, null, null, null, null)]
[InlineData(null, "other last name", null, null, null, null, null)]
[InlineData(null, null, "other company", null, null, null, null)]
[InlineData(null, null, null, "other street", null, null, null)]
[InlineData(null, null, null, null, "other city", null, null)]
[InlineData(null, null, null, null, null, "other zip", null)]
[InlineData(null, null, null, null, null, null, "other@email.com")]
public void EqualsIsFalseWhenAtLeastOneValueDiffers(
    string firstName,
    string lastName,
    string company,
    string street,
    string city,
    string zip,
    string email)
{
    Fixture fix = new Fixture();
    var sut = fix.CreateAnonymous<CoreAddress>();

    var other = new CoreAddress(
        firstName ?? sut.Firstname,
        lastName ?? sut.Lastname,
        company ?? sut.Company,
        street ?? sut.Street,
        city ?? sut.City,
        zip ?? sut.Zip,
        email ?? sut.Email);

    Assert.False(sut.Equals(other));
}

ただし、コンパクトですが、テスト自体の循環的複雑度が8であるため、このようなことをすることにあまり熱心ではありません.これは約7です.入力値のわずかな設定ミスだけでテストが台無しになる可能性があります.そして最終的に、偽陽性または偽陰性のいずれかを生成します。

一方、ここでは私たちは皆プログラマーです。同じことが繰り返されるようになったら、どうすればよいでしょうか。

退屈をなくすコードを書いてください。これは基本的にAutoFixture.Idiomsプロジェクトのすべてです。現在、上記のようなカプセル化されたテストはありませんが、将来的には取得される可能性があります... オープン ソースであり、プル リクエストを時折受け付けています。 ;)

于 2012-08-27T18:59:41.000 に答える
2

私に関する限り、値オブジェクトの等価性を単体テストすることは気にしません。本当にやりたい場合は、この種の単体テストを抽象化して、書くのがずっと簡単になる方法があります: http://kennethxu.blogspot.fr/2009/11/unit-test-value-object.html

于 2012-08-21T09:29:15.110 に答える