C# 如何使用AutoFixture简化DDD值对象的单元测试
我目前正在使用xUnit、Moq和AutoFixture为我的域项目编写单元测试。让我们看看这个测试方法:C# 如何使用AutoFixture简化DDD值对象的单元测试,c#,unit-testing,domain-driven-design,autofixture,C#,Unit Testing,Domain Driven Design,Autofixture,我目前正在使用xUnit、Moq和AutoFixture为我的域项目编写单元测试。让我们看看这个测试方法: [Theory] public void SameValueAs_OnOtherHasDifferentEmail_ReturnsFalse() { Fixture fix = new Fixture(); var sut = fix.CreateAnonymous<CoreAddress>(); var other = new CoreAddress
[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));
}
[理论]
public void SameValueAs\u onotherhasedifferentitemail\u ReturnsFalse()
{
夹具固定=新夹具();
var sut=fix.CreateAnonymous();
var other=新的核心地址(
sut.名字,
sut.Lastname,
苏特公司,
苏特街,
南部城市,
sut.ZIP,
"other@email.com");
Assert.False(sut.SameValueAs(其他));
}
如您所见,我正在测试类CoreAddress及其SameValueAs方法。为了测试每一个可能的情况,我必须创建其他HasDifferentitFirstName、其他HasDifferentitLastName等的测试方法。这个模式可以吗?关于AutoFixture的使用,我可以简化一下吗?就我而言,我不会费心对值对象进行单元测试。如果您真的想这样做,有一些方法可以抽象这种单元测试,并使它们编写起来不那么乏味:这种方法与我自己所做的非常相似。考虑到几乎所有的自动化测试都围绕着测试某个实际结果是否等于某个预期结果展开,我从未真正理解为什么人们不想单元测试平等性本身 对于上面这样的值对象,它很容易变得有点乏味,因为它会导致许多非常相似的测试 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));
}
[理论]
[InlineData(“其他名字”,null,null,null,null,null,null)]
[InlineData(null,“其他姓氏”,null,null,null,null,null,null)]
[InlineData(null,null,“其他公司”,null,null,null,null)]
[InlineData(null,null,null,“其他街道”,null,null,null)]
[InlineData(null,null,null,null,“其他城市”,null,null)]
[InlineData(null,null,null,null,null,“其他zip”,null)]
[InlineData(null,null,null,null,null,nullother@email.com")]
当NATLEASTONEVALUE不同时,public void equals为false(
字符串名,
字符串lastName,
弦公司,
字符串街,
字符串城市,
拉链,
字符串(电子邮件)
{
夹具固定=新夹具();
var sut=fix.CreateAnonymous();
var other=新的核心地址(
名字??sut.名字,
lastName??sut.lastName,
公司??sut.公司,
街??苏特街,
城市??南部城市,
zip??sut.zip,
电子邮件(sut.email);
Assert.False(sut.Equals(其他));
}
然而,虽然它很紧凑,但我不太热衷于这样做,因为测试本身的圈复杂度为8-这大约是7太多了。。。只有轻微的输入值配置错误才能破坏测试,最终产生误报或误报
另一方面,我们都是这里的程序员,如果事情变得重复,我们该怎么办
写一些代码来消除乏味。这就是这个项目的基本内容,虽然它目前没有像上面那样的封装测试,但将来可能会有一个。。。它是开源的,我们偶尔也会接受拉取请求;) 感谢您指出AutoFixture。习语,我将研究一下;)