C# 您应该测试它,因为应用程序代码中的任何代码都会使该模型处于不一致的状态
测试域实体时,应测试行为。和行为是使用实体中的方法添加的。最简单的入门方法是将所有属性设置器设置为私有C# 您应该测试它,因为应用程序代码中的任何代码都会使该模型处于不一致的状态,c#,unit-testing,domain-driven-design,moq,C#,Unit Testing,Domain Driven Design,Moq,测试域实体时,应测试行为。和行为是使用实体中的方法添加的。最简单的入门方法是将所有属性设置器设置为私有 public User { Address _address; public User(int id, Address address) { //assign } public int Id {get;private set;} public bool IsAddressSame(Address address) { if (addres
public User
{
Address _address;
public User(int id, Address address)
{
//assign
}
public int Id {get;private set;}
public bool IsAddressSame(Address address)
{
if (address == null)
throw new ArgumentNullException("address");
return address.Equals(_address);
}
public void Move(Address newAddress)
{
if (address == null)
throw new ArgumentNullException("address");
var old = _address;
_address = newAddress;
DomainEvent.Publish(UserMoved(_old, newAddress);
}
}
现在可以测试address方法的行为
如果不创建MyClass1,我如何测试MyClass1,将其与MyClass2隔离
自己的接口,然后使用moq在测试中创建一个实现
笨蛋
不要为域实体创建接口。接口的目的是创建抽象,以从应用程序的其他部分删除依赖项。将领域模型抽象出来有什么意义?在DDD中,它是应用程序的核心。没有它你就没有
由于状态现在受到保护,您知道每个实体都有一个正确的状态。因此,您不需要将用户与地址隔离。相反,只需为您创建的方法编写测试
更新以回答评论
“当您测试域实体时,您应该测试行为”看起来不错,但在TDD中,我必须在创建实现之前和之后编写测试,因此如果我想要一个具有Class2属性的Class1,我首先必须测试我是否具有此属性
不。在TDD中,您还应该测试行为。依赖关系由行为驱动,反之亦然 我的意思是,除非你有一个口头要求,要求对一个用户地址做一些事情,否则根本没有办法真正知道用户和地址之间有关系 根据这个要求,您应该在用户类上测试该方法,而不是直接访问地址 我没有理由为我的项目创建接口,但在这一点上,我很难创建测试 很多开始测试的人倾向于使用它有自己的优点(可以在一行代码中创建实例)和缺点(它们没有应该指定的行为,有时很难设置正确的行为) 我在整理测试数据时遇到了同样的问题,但我找到了几种解决方案 第一个解决方案是模式
var myClass1 = ClassBuilder.GetClass1();
var myClass2 = ClassBuilder.GetClass2();
var myClass1 = new Class1Builder.Build();
var myClass2 = new Class2Builder.WithSomeProprty().Build();
方法GetClass1()
和GetClass2()
封装创建逻辑
第二个是模式
var myClass1 = ClassBuilder.GetClass1();
var myClass2 = ClassBuilder.GetClass2();
var myClass1 = new Class1Builder.Build();
var myClass2 = new Class2Builder.WithSomeProprty().Build();
classbuilder
和Class2Builder
实现允许我们用足够清晰的名称链接方法
有两篇关于和模式的老文章
var myClass1 = ClassBuilder.GetClass1();
var myClass2 = ClassBuilder.GetClass2();
var myClass1 = new Class1Builder.Build();
var myClass2 = new Class2Builder.WithSomeProprty().Build();