4

私は次の方法を持っています:

[ExcludeFromCodeCoverage]
private static string GetAuthorizationToken(HttpActionContext actionContext)
{
    var authorization = actionContext.Request.Headers.FirstOrDefault(h => h.Key.Equals("Authorization"));
    // ... removed for brevity
}

この属性は、メソッドの属性にもかかわらずカバーされていないと表示される をExcludeFromCodeCoverage除いて、メソッド全体で機能します。h.Key.Equals("Authorization")

このシンボルをコード カバレッジの結果から除外するにはどうすればよいですか?

4

1 に答える 1

9

クラスで ExcludeFromCodeCoverage 属性を指定したにもかかわらず、カバーされていないと表示される理由を説明できます。説明は、コンパイラによって実際に生成される IL にあります。次のようなラムダ式に一致するデリゲートを宣言します。

private static Func<string, bool> AnonymousMethodDelegate;

次に、デリゲート宣言に一致する名前付きメソッドを作成します。

[CompilerGenerated]
private static bool CompilerGeneratedMethod(string h)
{
  return h.Equals("Authorization");
}

次に、最後に、メソッドでデリゲートを使用して名前付きメソッドを呼び出すと、次のようになります

[ExcludeFromCodeCoverage]
private static string GetAuthorizationToken(HttpActionContext actionContext)
{
  AnonymousMethodDelegate = CompilerGeneratedMethod;
  Func<string, bool> predicate = AnonymousMethodDelegate;
  return Enumerable.FirstOrDefault<string>((IEnumerable<string>) actionContext, predicate);
}

私はあなたが問題を見つけたと確信しています。ExcludeFromCodeCoverage 属性が付加されていないメソッドがコンパイラによって作成されました。これが、ExcludeFromCodeCoverage 属性を宣言したように見えても、NCover がカバーされていないと判断する理由です。

それを除外する 1 つの方法は、基本に戻って、コンパイラが行っていることを効果的に実行し、デリゲートと名前付きメソッドを宣言することです。これにより、その名前付きメソッドに ExcludeFromCodeCoverage 属性を追加できるようになります。明らかな理由から、私はこのソリューションの大ファンではありません。

明らかに、ExcludeFromCodeCoverage 属性をクラス レベルで追加すると、この生成されたメソッドもカバーされ、この問題を回避できますが、これにより、カバレッジ レポートに含めたいコードも除外されると思います。

もう 1 つの方法は、NCover を使用している場合、コンパイラによって生成されたすべてのメソッドが CompilerGenerated 属性で装飾されているという事実を利用することです。除外する属性を NCover に渡すことができるため、コマンド ラインまたは MSBuild タスクを介して System.Runtime.CompilerServices.CompilerGeneratedAttribute を渡すだけで済みます。これはおそらく私の好みのオプションです。

于 2012-11-02T00:02:24.650 に答える