7

Visual Studio 2012のコードカバレッジツールは、inlineカバーされている場合でも、すべての機能をカバーされていないものとしてマークします。

関数のコードカバレッジを機能させる方法はありますinlineか?

4

2 に答える 2

5

関数を作成するinlineと、コンパイラーは関数の本体を呼び出し元のコードにインライン化します。コメントで説明されているように、このインラインボディのデバッグ情報も出力されません(したがって、関数にステップインすることはできません-これは修正できると思います-at dotにリクエストを送信してfsbugsくださいmicrosoftcom

ただし、コンパイラは動的バージョンのコードも生成します。たとえば、次のように記述します。

let inline add a b = a + b

add次に、コンパイルされたコードに実際にメソッドがあります。このメソッドはジェネリック('a -> 'b -> 'c)であり、動的ルックアップを使用して+演算子の適切な実装を見つけます(.NETジェネリックはそのような制約を表すことができないため)。

リフレクションまたは引用符を使用すると、動的実装が呼び出されます。

open Microsoft.FSharp.Linq.RuntimeHelpers
<@ add 1 2 @> |> LeafExpressionConverter.EvaluateQuotation |> printfn "Got: %A"

ブレークポイントを内部に配置addして上記のコードを実行すると、ブレークポイントがヒットします(そして、コードカバレッジツールが関数をカバーされているものとして報告すると思います)。

ただし、これは通常のコードで記述したときに実際に実行されるコードではないadd 1 2ことに注意してください。ここで実行されるコードは別の実装です(インライン化ではなく低速の動的ルックアップを使用します)。

于 2013-03-12T14:32:36.903 に答える
3

インライン関数は呼び出し元のコードに直接統合されていませんか?その場合、コードが「インライン化」され、使用される場所ごとに、インライン化されたコードの新しいコピーが存在するため、実際のメソッドは呼び出されません。

于 2013-03-03T21:47:40.263 に答える