UNIT测试dto和域对象

时间:2012-05-08 20:10:39

标签: unit-testing mocking domain-driven-design dto

我打算编写一个抽象类来测试我所有的DTO和DOMAIN对象。此类将采用可模板化对象(泛型类型)并使用反射来获取属性的类型,并将为标识的基元类型分配一些默认值,稍后将通过访问它们来声明这些类型值。这样,每当我的DTO测试继承此类时,大多数代码都会使用测试中编写的一行代码进行测试。这只是一个想法,如果像这样的东西已经存在,我想知道我是否正在重新发明轮子?如果有更好的方法来使用更少且可恢复的代码来测试DTO和域对象。

3 个答案:

答案 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);
    }
}