如何从代码覆盖范围中排除属性中的 lambda 函数?

我正在尝试为我的 C# 应用程序收集一些好的代码覆盖率统计信息,但我想忽略生成的 SubSonic 类,因为收集这些函数的代码覆盖率统计信息没有真正意义。

我已经编辑了 ActiveRecord.tt 文件以在每个方法和属性上包含 [ExcludeFromCodeCoverage] 属性,这已经在我的代码覆盖率窗口中删除了大部分不相关的结果。然而,尽管有代码覆盖排除属性,属性中的 lambda 表达式被标记为未覆盖。举个例子:

[ExcludeFromCodeCoverage]
int GetValue
{
    get
    {
        this.SomeMethod(); // this is excluded
        return this.Find(x => x.Value == this._Value); // this.Find is excluded
                                                       // but x => x.Value == ...
                                                       // is not.
    }
}

这仅发生在属性中。正如预期的那样,Lambda 表达式在方法中被忽略。

现在,对我来说,这很烦人,但不一定是致命的,因为我可以在浏览代码覆盖率列表时忽略这些表达式。但是,我们的客户要求我们的代码覆盖率高于 95%。

我可以与 ActiveRecord.tt 文件一起自动生成单元测试,但这并不理想。

感谢您的时间。

stack overflow How can I exclude lambda functions in properties from code coverage?
原文答案

答案:

作者头像

虽然我不确定您使用什么工具进行单元测试,但您可以尝试将属性移到 get 方法声明的顶部:

int GetValue
{
    [ExcludeFromCodeCoverage]
    get
    {
        this.SomeMethod();
        return this.Find(x => x.Value == this._Value);
    }
}

这是因为在编译时,GetValue 属性被转换为带有签名 get_GetValue : int 的方法

作者头像

[ExcludeFromCoverage] 属性添加到类而不是属性。类中的所有内容都将被排除,包括 lambda。

作者头像

我不知道 C# 怎么样,但是在 Java 中这可以通过使用内部类来完成

class SuperTest {

    @ExcludeFromJacocoGeneratedReport
    public Object test() {
        return Optional.of(1)
                .map(FunctionWrapper.mapFunction)
                .orElseThrow();
    }

    @ExcludeFromJacocoGeneratedReport
    public static class FunctionWrapper {

        static Function<Object, String> mapFunction = String::valueOf;

    }
}
作者头像

派对可能有点晚了,但它应该可以在下面使用

int GetValue
{
    get
    {
        this.SomeMethod(); // this is excluded
        return this.Find([ExcludeFromCodeCoverage] x => x.Value == this._Value); // this.Find is excluded
                                                       // but x => x.Value == ...
                                                       // is not.
    }
}

如果它对其他人有帮助,我正在为 very similar issue 链接而苦苦挣扎。