【问题标题】:UNIT test dto and domain objectsUNIT 测试 dto 和域对象
【发布时间】:2012-05-08 20:10:39
【问题描述】:

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

【问题讨论】:

  • 如果我理解正确,您可以尝试测试 domainobject 和 dto 之间的映射是否完整,即没有属性丢失/丢失。如果您将编程语言添加到您的问题中,则可能已经有解决方案。根据我在 .dot 中的经验,如果您有许多 dtos(> 20),则唯一值得付出的努力。您的 testapi 必须考虑要从转换和可能不同的集合顺序中排除的属性
  • 你应该测试行为,而不是数据结构... DTO 是数据结构,你只需要测试通过某些行为(验证,if,规则)修改其状态的聚合方法,这是毫无价值的测试set 方法...如果您觉得需要测试它们,最好使用一些像项目 lombok 之类的库来生成它们...

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


【解决方案1】:

我不认为这是测试域对象的好方法。根据定义,这些对象封装了数据和相关行为,它们应该不仅仅是带有 getter 和 setter 的哑数据容器。您将不得不为这些对象手写单元测试,就像您自己手写对象一样。根据 DDD,这实际上是您应该花费时间的地方。

关于 DTO,您可能需要查看此 question

【讨论】:

  • 我同意域对象测试。还有一个小问题。如果我的几个域对象只是获取/设置,它们也可以用作 DTO。我可以将域对象用作我的 web 服务的不同情况的 dto。
  • 我不会将域对象用作 DTO,因为它会将您的 Web 服务使用者与您的域对象耦合。当您希望在不影响 Web 服务客户端的情况下发展您的域时,这将导致问题。
【解决方案2】:

我的建议:

  • 不要对 DTO 进行单元测试。这些只是简单的数据结构,有一堆 getter 和 setter,没有任何行为。 getter 和 setter 太笨了,无法测试(除非它们封装了某种条件逻辑,而这在 DTO 中很少出现)。

  • 不要尝试自动化或通用化您的域对象测试。我看不出测试它们行为的代码是如何被重用的,因为根据定义它们都有不同的行为。

【讨论】:

    【解决方案3】:

    尽管我认为对 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 2011-07-17
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多