将PEX测试代码限制为单一方法?

时间:2011-09-22 17:59:18

标签: c# .net unit-testing moles pex

PEX中的被测代码是否可以限制为单一方法?我知道你可以将它约束到程序集和类,但是成员呢?

我基本上试图为以下方法实现100%的代码覆盖率:

public virtual bool GetLastSymbol(string symbolHint, out string symbol)
{
    if (symbolHint == null)
    {
        throw new ArgumentNullException("symbolHint");
    }

    IEnumerable<string> symbols;
    symbol = this.VariableHints.TryGetValue(symbolHint, out symbols) ? symbols.Last() : null;

    return symbol != null;
}

以下PUT实现 12/15 代码覆盖率,因为我只测试它可以返回的可能的2个值中的一个:

found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsFalse(found);

要实现此PUT的完全覆盖,我需要更改对象的状态,以便方法命中两个分支。我可以通过使用单独的PUT使用工厂方法来设置不同的状态来满足这一要求,但是这将使我有2个PUT具有不完整的代码覆盖,而不是1 PUT具有完全覆盖。我在理论上认识到 2个PUT的综合覆盖率为100%,但我需要在实践中100%计算 所以我可以正确设置CI。

因此,为了到达同一个PUT中的另一个分支,我必须将以下代码附加到上面两行:

symbolManager.CreateSymbol(symbolHint); // Ensure next call returns true.
found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsTrue(found);

大概GetLastSymbol方法的代码覆盖率现在是100%,但因为我已经对被测试类型引入了另一个方法调用,所以代码覆盖率现在降至 20/29

如何限制PUT仅测量单个方法的代码覆盖率?我意识到我可能完全误解了这个指标,所以请解释为什么会出现这种情况:)

1 个答案:

答案 0 :(得分:0)

随PEX一起安装的'PEX API Reference'对解决这个问题非常有用:

Microsoft.Pex.Framework.Coverage名称空间包含多个过滤器属性,这些属性可以排除影响代码覆盖率的各个方面。我想要的是:

PexCoverageFilterMethodAttribute

使用此方法,我可以从覆盖率报告中删除CreateSymbol方法:

[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "CreateVariable")]

现在我的代码覆盖率增加到 13/15 ;比以前更高,但仍然不是我期待的100%。长话短说,我发现PEX也在封面报告中包含了构造函数......

[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "ctor")]

我正在接收 13/13 以获取我的代码覆盖率。我是一个快乐的兔子:)。