我打算编写一个抽象类来测试我所有的DTO和DOMAIN对象。此类将采用可模板化对象(泛型类型)并使用反射来获取属性的类型,并将为标识的基元类型分配一些默认值,稍后将通过访问它们来声明这些类型值。这样,每当我的DTO测试继承此类时,大多数代码都会使用测试中编写的一行代码进行测试。这只是一个想法,如果像这样的东西已经存在,我想知道我是否正在重新发明轮子?如果有更好的方法来使用更少且可恢复的代码来测试DTO和域对象。
答案 0 :(得分:3)
我认为这不是测试Domain对象的好方法。根据定义,这些对象封装了数据和相关行为,他们认为不仅仅是具有getter和setter的哑数据容器。您将不得不亲自为这些对象编写单元测试,就像您手动编写对象本身一样。这是你实际上根据DDD花费时间的地方。
关于DTO,您可能需要查看此question。
答案 1 :(得分:1)
我的建议:
不要对DTO进行单元测试。这些只是简单的数据结构,包含一堆getter和setter,没有任何行为。吸气剂和制定者太愚蠢而无法测试(除非他们封装某种条件逻辑,而DTO的情况很少见。)
不要尝试自动化或泛化域对象测试。我无法看到测试其行为的代码如何可以重复使用,因为根据定义它们都有不同的行为。
答案 2 :(得分:0)
尽管我认为对单元测试DTO毫无价值,但根据@Dmitry的回答,我提出了这个课程:
[TestClass]
public class PeopleTest
{
[TestMethod]
public void OneObjectNull()
{
Person obj1 = null;
var obj2 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
Assert.AreNotEqual(obj1, obj2);
Assert.AreNotEqual(obj2, obj1);
}
[TestMethod]
public void DeepEqual()
{
var obj1 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
var peolpleList1 = new List<Person> { obj1 };
var peolpleList2 = new List<Person> { obj1 };
Assert.AreEqual(obj1, obj1);
CollectionAssert.AreEqual(peolpleList1, peolpleList2);
}
[TestMethod]
public void DeepNotEqual()
{
var obj1 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
var obj2 = new Person
{
Id = "102",
Name = "Rachel Smith",
Address = "Lake Palmer 10"
};
var peolpleList1 = new List<Person> { obj1 };
var peolpleList2 = new List<Person> { obj2 };
Assert.AreNotEqual(peolpleList1, peolpleList2);
var group1 = new KeyValuePair<string, List<Person>>("group1", peolpleList1);
var group2 = new KeyValuePair<string, List<Person>>("group2", peolpleList2);
Assert.AreNotEqual(group1, group2);
}
[TestMethod]
public void PropertyPositive()
{
var obj1 = new Person
{
Id = "101",
Name = "George Waits",
Address = "Lake Palmer 10"
};
obj1.Address = "Parker av 101";
var obj2 = new Person
{
Id = "102",
Name = "Rachel Smith",
Address = "Lake Palmer 10"
};
obj1.Address = "Listener av 45";
Assert.AreNotEqual(obj1, obj2);
}
}