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
ことに注意してください。ここで実行されるコードは別の実装です(インライン化ではなく低速の動的ルックアップを使用します)。
インライン関数は呼び出し元のコードに直接統合されていませんか?その場合、コードが「インライン化」され、使用される場所ごとに、インライン化されたコードの新しいコピーが存在するため、実際のメソッドは呼び出されません。