我打算写一个抽象类的东西来测试我所有的 DTO 和 DOMAIN 对象。这个类将接受模板对象(通用类型)并使用反射来获取其中的属性类型,并将一些默认值分配给识别的原始类型,稍后将通过访问它们来断言这些类型值。这样,每当我的 DTO 测试继承这个类时,大部分代码都使用在测试中编写的一行代码进行测试。这只是一个想法,如果我正在重新发明轮子,如果这样的东西已经存在,想从你们那里知道吗?如果有更好的方法可以用更少且可重复的代码来测试 DTO 和域对象。
问问题
5874 次
3 回答
4
我不认为这是测试域对象的好方法。根据定义,这些对象封装了数据和相关行为,它们应该不仅仅是带有 getter 和 setter 的哑数据容器。您将不得不为这些对象手写单元测试,就像您自己手写对象一样。根据 DDD,这是您实际假设要花费时间的地方。
关于 DTO,您可能想看看这个问题。
于 2012-05-08T22:37:10.850 回答
1
我的建议 :
不要对 DTO 进行单元测试。这些只是简单的数据结构,有一堆 getter 和 setter,没有任何行为。getter 和 setter 太笨了,无法测试(除非它们封装了某种条件逻辑,而这在 DTO 中很少出现)。
不要试图自动化或泛化您的域对象测试。我看不出测试它们行为的代码是如何被重用的,因为它们都有不同的行为定义。
于 2012-05-09T13:21:02.967 回答
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);
}
}
于 2016-12-23T10:04:44.387 回答