如何使用位置构造函数获取 C# 记录设置器的代码覆盖率

Posted

技术标签:

【中文标题】如何使用位置构造函数获取 C# 记录设置器的代码覆盖率【英文标题】:How to get code coverage on C# record setters with positional constructor 【发布时间】:2022-01-24 01:41:28 【问题描述】:

我注意到我的具有位置构造函数语法的 C# 记录在 Visual Studio 2022 Enterprise 中报告没有代码覆盖。例如,一条记录定义为:

public record BallPoint(int X, int Y, int Z);

还有测试:

        [Fact]
        public void Test1()
        
            var sut = new BallPoint(1, 2, 3);

            Assert.Equal(1, sut.X);
            Assert.Equal(2, sut.Y);
            Assert.Equal(3, sut.Z);
        

然后覆盖显示没有覆盖的内部setter:

我怎样才能获得 100% 的记录覆盖率?

【问题讨论】:

向我们展示构造函数。它是在调用那些 set 方法来加载自己吗? @HackSlash:这是一个带有主构造函数的record 类型。构造函数已在帖子中显示。它将根据参数初始化XYZ 属性。故事结束。 @avenue19:看起来代码覆盖率跟不上时代了。构造函数 IL 正在调用 set_* 访问器方法。 @avenue19:正如我和 HackSlash 得出的结论,这个测试用例毫无意义,因为您实际上是在测试编译器是否正常工作。你不需要这样做。 Microsoft 已经有大量的测试用例可以做到这一点。 【参考方案1】:

更改您的测试以调用设置的方法。

    [Fact]
    public void Test1()
    
        var sut = new BallPoint();
        sut.X = 1;
        sut.Y = 2;
        sut.Z = 3;

        Assert.Equal(1, sut.X);
        Assert.Equal(2, sut.Y);
        Assert.Equal(3, sut.Z);
    

或者,您可以更改构造函数以显式调用 set 方法。

【讨论】:

主构造函数的位置参数是init-only属性,不能这样赋值。由于它们是构造函数参数,因此它们是必需的,因此在对象初始化器中分配它们是没有意义的(冗余或矛盾的)。 @madreflection 尝试测试它们不是没有意义吗? 是的。这个测试用例归结为测试编译器,而不是用户代码。 谢谢。这就是为什么我很困惑。我以为我们在谈论自定义类。

以上是关于如何使用位置构造函数获取 C# 记录设置器的代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

C# 关于 构造函数问题 关于对象实例化

C#如何获取已定义预处理器的列表?

如何在 Android 中获取位置管理器的最后一个已知位置?

C# winform程序中 如何获取和设置dataGridView1的垂直滚动条当前位置?

c#构造函数通过反射获取'base'部分

C# - 如何在不使用索引器的情况下获取自定义集合的第一项?