質問

ユニットテストプロジェクトから実行されているコードをデバッグしようとしていますが、メソッドにステップインしようとすると、次の行にまっすぐに渡され、そのメソッド内のブレークポイントはヒットしません。このメソッドは別のプロジェクトにあるクラスにありますが、すべてのコードはデバッグモードでビルドされているため、ソリューションのクリーニングと再構築を楽しそうに試みました。

ただし、これは、イテレータブロックをメソッドに追加してからしか発生していません。削除して再構築すると、問題なくステップインできます。奇妙?

Visual Studio 2010 Beta 1を使用していますが、これは単なるバグですか?

役に立ちましたか?

解決

イテレータブロックは遅延実行を使用します-つまり、実際にデータの反復処理を開始するまで、何も実行されません。

それで、データは反復されましたか?値をループしているものはありますか?できるだけ早く実行する検証ロジックを追加する必要がある場合、現在2つのメソッドが必要です。

public static IEnumerable<int> GetNumbers(int from, int to) {
    // this validation runs ASAP (not deferred)
    if (to < from) throw new ArgumentOutOfRangeException("to");
    return GetNumbersCore(from, to);
}
private static IEnumerable<int> GetNumbersCore(int from, int to) {
    // this is all deferred
    while (from <= to) {
        yield return from++;
    }
}

他のヒント

マークは正しいです。メソッドは遅延実行され、イテレータが実際に実行されるまでメソッドにステップインできません。

ユニットテストでイテレータブロックをデバッグする必要がある場合、次のようにします。メソッドの名前はGetStuffと仮定します。

[TestMethod]
public void TestGetStuff() {
  var obj = GetStuffObje();
  var list = obj.GetStuff().ToList();
}

.ToList()呼び出しは、イテレーターを強制的に完了させます。次に、GetStuffメソッド内にブレークポイントを設定し、デバッグセッションを開始します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top