Visual Studio 2012のコードカバレッジツールは、inlineカバーされている場合でも、すべての機能をカバーされていないものとしてマークします。
関数のコードカバレッジを機能させる方法はありますinlineか?
Visual Studio 2012のコードカバレッジツールは、inlineカバーされている場合でも、すべての機能をカバーされていないものとしてマークします。
関数のコードカバレッジを機能させる方法はありますinlineか?
関数を作成するinlineと、コンパイラーは関数の本体を呼び出し元のコードにインライン化します。コメントで説明されているように、このインラインボディのデバッグ情報も出力されません(したがって、関数にステップインすることはできません-これは修正できると思います-at dotにリクエストを送信してfsbugsくださいmicrosoft)com。
ただし、コンパイラは動的バージョンのコードも生成します。たとえば、次のように記述します。
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ことに注意してください。ここで実行されるコードは別の実装です(インライン化ではなく低速の動的ルックアップを使用します)。
インライン関数は呼び出し元のコードに直接統合されていませんか?その場合、コードが「インライン化」され、使用される場所ごとに、インライン化されたコードの新しいコピーが存在するため、実際のメソッドは呼び出されません。