3

我打算写一个抽象类的东西来测试我所有的 DTO 和 DOMAIN 对象。这个类将接受模板对象(通用类型)并使用反射来获取其中的属性类型,并将一些默认值分配给识别的原始类型,稍后将通过访问它们来断言这些类型值。这样,每当我的 DTO 测试继承这个类时,大部分代码都使用在测试中编写的一行代码进行测试。这只是一个想法,如果我正在重新发明轮子,如果这样的东西已经存在,想从你们那里知道吗?如果有更好的方法可以用更少且可重复的代码来测试 DTO 和域对象。

4

3 回答 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 回答