3

[編集]: 適切なサイトの質問については、ここをクリックしてください。

テストを書いていて、テストに合格する必要があるところまで来て、独自の機能に分離する必要がある追加の機能が必要であることに気付いたとき、あなたはどうしますか? その新しい関数もテストする必要がありますが、TDD サイクルでは、テストを失敗させ、合格させてからリファクタリングするように指示されています。テストに合格しようとしているステップにいる場合、実装する必要がある新しい機能をテストするために、別の失敗したテストを開始する必要はありません。

たとえば、関数WillCollideWith( LineSegment )を持つポイント クラスを作成しています。

public class Point {
    // Point data and constructor ...

    public bool CollidesWithLine(LineSegment lineSegment) {
        Vector PointEndOfMovement = new Vector(Position.X + Velocity.X,
                                               Position.Y + Velocity.Y);
        LineSegment pointPath = new LineSegment(Position, PointEndOfMovement);
        if (lineSegment.Intersects(pointPath)) return true;
        return false;
    }
}

LineSegment.Intersects( LineSegment )関数が必要になることに気付いたとき、 CollidesWithLineのテストを書いていました。しかし、この新しい機能を作成するために、テスト サイクルで行っていることをやめるべきでしょうか? それは「赤、緑、リファクタリング」の原則を破っているようです。

CollidesWithLine関数内で lineSegments Intersect を検出するコードを記述し、動作後にリファクタリングする必要がありますか? この場合はLineSegmentからデータにアクセスできるのでうまくいきますが、そのようなデータが非公開の場合はどうでしょうか?

4

3 に答える 3

2

Kent Beck が彼の著書で定義している通りに TDD に従っている場合、テストする必要があるものに出くわした場合は、それを紙に書き留めます (彼はこれをテスト リストと呼んでいます)。 ) そして、現在のテストに集中します。Kent は、一度に 1 つのテストに取り組むべきだと提案しています。

テストファーストの観点から、テストに合格することに集中する必要があります。これにはいくつかのオプションがあります。

  1. Intersects の実装を現在のメソッドにインラインで記述します。「緑」は、きれいではなく、機能していることを意味します。作業が完了したら、コードとテストの両方をリファクタリングします。

  2. それをスタブします。コントラクトをシミュレートできるメソッドにテスト ダブル (モック) を渡します。

  3. ごまかす。必要なメソッドに出くわしたら、他のテストのメモを作成し、基本的な実装を記述します (例: "return true")。

于 2012-11-10T15:00:37.363 に答える
1

最善のオプションは、それをモックすることです。そうすれば、ワークフローにとどまり、一度に限られた量のコードをテストすることもできます。

于 2012-11-09T18:02:52.890 に答える
0

注意が必要なテストをマークするために属性を使用するのが好き[Ignore]です (たとえば、完了していない場合)。そのようなテストは実行されません。無視されたテストは、テスト ランナー (通常は黄色またはオレンジ色) で強調表示されます。他のすべてのテストに合格した場合でも、無視されたテストがある間は緑色の線は表示されません。これにより、テストが忘れられないことが保証されます。

于 2012-11-09T17:20:19.603 に答える