6

テスト駆動開発アプローチを使用して、C#で小さなゲームを書いています。私は問題に直面しています:

私はクラスを持っていますCheckersBoard

public class CheckersBoard
{
    private const string InitialBoardPattern = "B-B-B-B-" +
                                               "-B-B-B-B" +
                                               "B-B-B-B-" +
                                               "--------" +
                                               "--------" +
                                               "-W-W-W-W" +
                                               "W-W-W-W-" +
                                               "-W-W-W-W";

    public SquareStatus[,] Squares { get; private set; }

    public CheckersBoard(IBoardGenerator boardGenerator)
    {
        Squares = boardGenerator.GenerateFromPattern(InitialBoardPattern, 8, 8);
    }

    //....
}

そしてクラスBoardGenerator

public class BoardGenerator : IBoardGenerator
{

    public SquareStatus[,] GenerateFromPattern(string pattern, int width, int height)
    {
        //....
    }

}

BoardGeneratorCheckersBoard非常に読みやすい方法で初期化できます。BoardGeneratorだから、私は本当に醜い配列の初期化を避けるために私のユニットテストで使用したいと思います。

しかし、すべての単体テストを互いに独立させておく必要があるという規則に反しています。のテストがGenerateFromPattern失敗した場合、それは「カスケード」効果を生み出し、使用GenerateFromPatternするすべてのテストも失敗します。

ユニットテストを使うのはこれが初めてなので、少し混乱しています。この問題を回避するにはどうすればよいですか?私のデザインに何か問題がありますか?

4

2 に答える 2

2

どうやらこれは明白な答えのない一般的な問題であり、私はたまたま2つの同様の質問に対処しました。

あるレベルでは、ビジネスロジック(他のテスト済みコンポーネント)を再利用することは、単体テストでサードパーティライブラリを使用することに似ています。これらは機能すると想定しており、それらについて余分なアサーションを生成する必要はありません。List<T>ユニットテストで使用することをためらうことはありますか?ほとんどの場合、ありません。ただし、これList<T>は他の多くの開発者によって毎日テストされており、背後に大きなソフトウェアハウスがあることに注意してください。あなたは同じことを言うことができますBoardGeneratorか?

考慮すべきもう1つの質問は、CheckersBoardテストコードは、あなたと同じように作業したことがない人にとっても明白BoardGeneratorでしょうか?あなたはそれが読みやすいと主張します、しかしそれはオーサリングを考えると一般的です。たぶん、配列の初期化を使用することは、あなたが思っているほど悪くはありません(読めません)。

于 2012-09-05T13:34:16.923 に答える
1

クラスをモックするBoardGeneratorか、実装を偽造することができます。

internal class MockBoardGenerator : IBoardGenerator
{
    public SquareStatus[,] GenerateFromPattern(string pattern, int width, int height)
    {
        // return fixed test data
    }
}
于 2012-09-05T12:58:25.850 に答える