当断言函数返回预期的 DTO 对象时,如何在 DTO 对象类的 getter 上获得 100% 的测试覆盖率?

Posted

技术标签:

【中文标题】当断言函数返回预期的 DTO 对象时,如何在 DTO 对象类的 getter 上获得 100% 的测试覆盖率?【英文标题】:How to get 100% test coverage over a DTO object class's getters when asserting function returns expected DTO object? 【发布时间】:2019-12-25 00:39:47 【问题描述】:

我通过断言我的 repo 层返回一个 DTO 对象来对 ASP.Net Core API 进行单元测试。当我测试行为时,我并不关心我的 DTO 对象有什么值,所以我使用 AutoFixture 自动生成它们。我也在努力满足我公司的代码气味检查,这要求我们的 PR 具有接近 100% 的测试覆盖率。当我模拟我的 ORM 以在调用时返回我的 DTO 对象,而被测函数又返回该对象时,我最终得到的实际对象与我的预期相同。当使用流利的断言进行断言时,它会看到对象引用相等并通过了我的测试。但是对于测试覆盖率,我不会看到 DTO 属性的 getter 的覆盖率。如果对象引用不同,流利的断言调用getter。如何通过调用所有 getter 来强制流利断言始终检查所有属性的值?

我尝试过使用ComparingByValue<T>ComparingByMember<T>。我也试过IncludingProperties()IncludingMembers()IncludingAllDeclaredProperties()IncludingAllRuntimeProperties()

        [Fact]
        public void GivenObjectReferenceIsTheSame_FluentAssertionDoesntCallTheGetters()
        
            var someDTO = _fixture.Create<SomeDTO>();
            var otherDTO = someDTO;

            otherDTO.Should().BeEquivalentTo(someDTO);
        
        [Fact]
        public void GivenObjectReferenceIsDifferent_FluentAssertionCallsTheGetters()
        
            var someDTO = _fixture.Create<SomeDTO>();
            var otherDTO = JsonConvert.DeserializeObject<SomeDTO>(JsonConvert.SerializeObject(someDTO));

            otherDTO.Should().BeEquivalentTo(someDTO);
        

我想要一种方法来始终强制流利的断言调用 getter,以便在 DTO 上获得测试覆盖率,而不必显式地在 DTO 上编写无用的测试

【问题讨论】:

100% 的测试覆盖率是一个毫无意义的指标。你可能有 100% 的测试覆盖率,但仍然没有测试 正确 的东西。更重要的是,达到 100% 的测试覆盖率几乎总是会产生颠倒的投资回报率,你花在编写测试上的时间比这些测试实际提供的价值要多。您的测试应该关注最重要的功能,并且应该从那里有机地发展。为测试而测试不为任何人服务。 我绝对和 100%(双关语)同意你的看法。问题是我公司的架构团队不是最精通的.Net 开发人员。他们添加了 SonarQube 来阻止测试覆盖率不高的 PR。我的 API 是 TDDed,但我的测试只覆盖了 85%。我的大多数 DTO 只是从 repo 获取并吐出到端点,而无需调用 getter 和 setter。通常,DTO 将通过测试行为被代理测试和覆盖。如果我可以流畅地断言调用 getter,我就不必为 getter 和 setter 编写测试 使用反射和断言相等来循环属性对你来说就足够了吗? 您的测试有多少覆盖率? ;) 如果你开始编写所有这些自定义代码来自动测试 getter 之类的东西,那么你就有了需要测试的测试代码。 @Nkosi 如果我要去哪条路,只对每个属性进行断言比编写反射函数来获取每个属性更容易。我想在某种程度上,这是流利的断言。我想强迫这种行为 【参考方案1】:

简短的回答是你不能。您已要求 FA 断言对象是等价的,事实上,它们是相同的。这满足了 FA 试图做的事情。唯一的选择是传入另一个实例,该实例的属性设置为期望值。这甚至可以是一个匿名对象。 ComparingByValue 仅用于强制 FA 忽略 Equals 实现并比较各个字段和属性。

【讨论】:

以上是关于当断言函数返回预期的 DTO 对象时,如何在 DTO 对象类的 getter 上获得 100% 的测试覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章

jemter-断言

Hive 宏未返回预期结果

TypeScript 杂记十 《断言函数》

TypeScript 杂记十 《断言函数》

TypeScript 杂记十 《断言函数》

测试时禁用断言