如何使用位置构造函数获取 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
类型。构造函数已在帖子中显示。它将根据参数初始化X
、Y
和Z
属性。故事结束。
@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# 记录设置器的代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中获取位置管理器的最后一个已知位置?