8

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

ただし、これはメソッドに反復子ブロックを追加してから発生しただけです。取り外して再構築すると、うまくステップインできます。変?

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

4

2 に答える 2

13

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

だから:データは繰り返されましたか?値をループしているものはありますか? できるだけ早く実行される検証ロジックを追加する必要がある場合は、現在、次の 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++;
    }
}
于 2009-06-21T14:57:11.143 に答える
6

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

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

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

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

于 2009-06-21T15:00:04.633 に答える