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

问题描述

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

我试过使用ComparingByValue<T>and 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 上显式编写无用的测试

标签: asp.net-corexunitfluent-assertionstest-coverage

解决方案


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


推荐阅读