这种方法与我自己会做的非常相似。鉴于几乎所有的自动化测试都围绕着测试一些实际结果等于一些预期结果,我从来没有真正理解为什么人们不想对相等性本身进行单元测试。
使用像上面这样的值对象,它很容易变得有点乏味,因为它会导致许多非常相似的测试。
您可以与 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项目的全部内容,虽然它目前没有像上面那样的封装测试,但它可能会在未来得到一个......它是开源的,我们偶尔会接受拉取请求;)