dotCover を使用して単体テストのコード カバレッジを分析していますが、奇妙な結果が得られています...カバレッジが完全ではない反復子メソッドがありますが、カバーされていないステートメントは単なる閉じ括弧ですメソッドの最後に。
私がテストしている方法は次のとおりです。
public static IEnumerable<T> CommonPrefix<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
source.CheckArgumentNull("source");
other.CheckArgumentNull("other");
return source.CommonPrefixImpl(other, comparer);
}
private static IEnumerable<T> CommonPrefixImpl<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
comparer = comparer ?? EqualityComparer<T>.Default;
using (IEnumerator<T> en1 = source.GetEnumerator(),
en2 = other.GetEnumerator())
{
while (en1.MoveNext() && en2.MoveNext())
{
if (comparer.Equals(en1.Current, en2.Current))
yield return en1.Current;
else
yield break;
}
} // not covered
} // not covered
単体テスト:
[Test]
public void Test_CommonPrefix_SpecificComparer()
{
var first = new[] { "Foo", "Bar", "Baz", "Titi", "Tata", "Toto" };
var second = new[] { "FOO", "bAR", "baz", "tata", "Toto" };
var expected = new[] { "Foo", "Bar", "Baz" };
var actual = first.CommonPrefix(second, StringComparer.CurrentCultureIgnoreCase);
Assert.That(actual, Is.EquivalentTo(expected));
}
カバレッジの結果は次のとおりです。
ブロックの右中括弧は、using
実際にDispose
は列挙子に対する呼び出しであると想定しています。しかし、なぜ実行されないのですか?私は最初、NUnit が列挙子を破棄していないのではないかと疑っていましたが、 foreach を実行しても同じ結果が得られactual
ます。
2 つ目のカバーされていない右中括弧については、それが何を表しているのかわかりません...コンパイラが反復子ブロックを変換する方法に関連していると思います。
これら2つの「ステートメント」が何であるか、そしてなぜそれらが実行されないのかについて、誰かが光を当てることができますか?
編集: ピーターは非常に良い質問を提起しました: 上記の結果は、デバッグ ビルドでテストを実行したときに得られたものです。リリース ビルドでテストを実行すると、メソッドのカバレッジCommonPrefixImpl
は 100% になるため、コンパイラの最適化に関連している可能性があります。