介绍
领域驱动设计涵盖的知识点比较多,其中代码的架构、设计、编写基本上只占到其中的很小一部分,其它的大部分讲解的是需求的获取方式、项目的管理方式等知识。本篇就是针对这一小部分的知识点位来展开的。所以本篇的学习前提是只需要了解DDD的架构分层即可。
应用场景
DDD领域驱动设计中一旦领域驱动层模型建立完毕,就会产生出数据库持久化的接口即仓储的接口供其它层来做具体实现,所以要想建立领域层的单元测试,就必须实现这些仓储接口或者模拟出这些接口实现。我们可以采用NMock来进行模拟仓储的实现。下面开始学习下代码:
我所建立的领域层的对象都比较简单,结构如下:
其中Entity的Order我们就当他是聚合根吧,IRepository下作为仓储接口,ValueObject为值对象。具体代码如下:
地址Address类:
public class Address
{
public string City { get; set; }
public string Country { get; set; }
}
联系方式Contact类:
public class Contact
{
public string Phone { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class Result
{
public int ID { get; set; }
public int RowEffect { get; set; }
}
仓储接口:
public interface IAddressRepository
{
Result SaveAddress(Address address);
}
public interface IContactRepository
{
Result SaveContact(Contact contact);
}
聚合根Order类:
public class Order
{
private IContactRepository _contactRp;
private IAddressRepository _addressRp;
public Order(IContactRepository contactRp, IAddressRepository addressRp)
{
this._contactRp = contactRp;
this._addressRp = addressRp;
}
public int InitOrder(Address address,Contact contact)
{
int rowEffect=0;
if (address != null && !string.IsNullOrEmpty(address.City))
{
Result r = _addressRp.SaveAddress(address);
rowEffect += r.RowEffect;
}
if (contact != null && !string.IsNullOrEmpty(contact.Name))
{
Result r = _contactRp.SaveContact(contact);
rowEffect += r.RowEffect;
}
return rowEffect;
}
}
要想建立InitOrder的单元测试必须要传入两个仓储接口的具体实现类,我们这里使用NMock进行模拟,代码如下:
[TestMethod]
public void TestMockDDD()
{
MockFactory _factory = new MockFactory();
Mock<IAddressRepository> addressRp = _factory.CreateMock<IAddressRepository>();
Mock<IContactRepository> contactRp = _factory.CreateMock<IContactRepository>();
Order order = new Order(contactRp.MockObject, addressRp.MockObject);
Address adress = new Address()
{
City = "温州",
Country = "中国"
};
Contact contact = new Contact()
{
Name = "张三",
Age = 24,
Phone = "131111111111"
};
Result result = new Result();
result.ID = 10000;
result.RowEffect = 1;
addressRp.Expects.One
.Method(d => d.SaveAddress(null))
.With(adress)
.Will(Return.Value(result));
contactRp.Expects.One
.Method(d => d.SaveContact(null))
.With(contact)
.Will(Return.Value(result));
int count=order.InitOrder(adress, contact);
Assert.AreEqual(count, 2);
}
单元测试的内容暂时就先学到这儿了,本系列的源码如下: http://yunpan.cn/cV6wchVc6eveA 访问密码 8d43。