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 方法。要测试所有可能的情况,我必须创建测试方法OnOtherHasDifferentFirstnameOnOtherHasDifferentLastname等。这种模式可以吗?关于 AutoFixture 的使用,我能以某种方式简化这一点吗?

4

2 回答 2

8

这种方法与我自己会做的非常相似。鉴于几乎所有的自动化测试都围绕着测试一些实际结果等于一些预期结果,我从来没有真正理解为什么人们不想对相等性本身进行单元测试。

使用像上面这样的值对象,它很容易变得有点乏味,因为它会导致许多非常相似的测试。

您可以与 xUnit.net 一起使用的一种技巧是:

[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 回答