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

时间:2010-09-03 15:20:15

标签: c# unit-testing c#-4.0 code-coverage

我正在尝试为我的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文件,但这并不理想。

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

虽然我不确定您使用哪些工具进行单元测试,但您可以尝试在get方法声明的基础上移动该属性:

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

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

的方法

答案 1 :(得分:1)

[ExcludeFromCoverage]属性添加到类而不是属性中。课堂上的所有内容都将被排除在外,包括lambdas。