2

私は次のユニットテストを持っています:

[TestMethod]
public void NewGamesHaveDifferentSecretCodesTothePreviousGame()
{
    var theGame = new BullsAndCows();


    List<int> firstCode = new List<int>(theGame.SecretCode);
    theGame.NewGame();
    List<int> secondCode = new List<int>(theGame.SecretCode);
    theGame.NewGame();
    List<int> thirdCode = new List<int>(theGame.SecretCode);

    CollectionAssert.AreNotEqual(firstCode, secondCode);
    CollectionAssert.AreNotEqual(secondCode, thirdCode);
}

デバッグ モードで実行するとコードはテストに合格しますが、通常 (実行モード) でテストを実行すると合格しません。スローされる例外は次のとおりです。

CollectionAssert.AreNotEqual failed. (Both collection contain same elements).

これが私のコードです:

// constructor
public BullsAndCows()
{
    Gueses = new List<Guess>();
    SecretCode = generateRequiredSecretCode();
    previousCodes = new Dictionary<int, List<int>>();
}

public void NewGame()
{
    var theCode = generateRequiredSecretCode();

    if (previousCodes.Count != 0)
    {
        if(!isPreviouslySeen(theCode))
        {
            SecretCode = theCode;
            previousCodes.Add(previousCodes.Last().Key + 1, SecretCode);  
        }
    }
    else
    {
        SecretCode = theCode;
        previousCodes.Add(0, theCode);
    }
 }

previousCodesはクラスのプロパティであり、そのデータ型はDictionary key integer, value List of integersです。SecretCodeもクラスのプロパティであり、そのデータ型は整数のリストです

推測すると、その理由は NewGame() メソッドが再度呼び出されたのに、最初の呼び出しで必要な処理が実際には完了していないためだと言えます。ご覧のとおり、NewGame() メソッド内から他のメソッドが呼び出されています (例: generateRequiredSecretCode())。

デバッグ モードで実行している場合、F10 キーを押すペースが遅いため、プロセスが終了するのに十分な時間が与えられます。

しかし、原因の特定が正しいと仮定すると、それを修正する方法が本当にわかりません。

4

1 に答える 1

0

generateRequiredSecretCode重複を生成すると、 SecretCode はどうなりますか? 未処理のようです。

1 つの可能性は、重複を取得しているためSecretCode、以前の値と同じままにすることです。ジェネレーターはどのように機能しますか?

また、BullsAndCowsコンストラクターがどのように初期化されているかを示していませんSecretCodeか? それはNewGameを呼んでいますか?

テストメソッドは入力を待たずに順番に関数を呼び出すため、キープレスの速度がそれと関係があるとは思えません。そしてgenerateReq...、スレッドを生成していない限り、戻る前に何をしていても完了します。

--アップデート後--

2 つのバグが見られます。
1) コンストラクターで最初にSecretCode生成されたものは、のリストに追加されませんpreviousCodes。したがって、2 番目のゲームに同じコードがある場合、重複チェックはキャッチされません。
2)previousCodesデータが入力された後、重複を生成するケースを処理しません。重複は以前に見られたため、previousCodesリストに追加しませんが、どちらも更新しないSecretCodeため、古い値が保持されます。

これがリリース モードでのみ表示される理由は正確にはわかりませんが、デバッグ モードで乱数ジェネレータを処理する方法が異なる可能性があります。WPF でランダム化する方法を参照してください。リリース モードはより高速であるため、シードと同じタイムスタンプを使用するため、実際にはまったく同じ一連の数字が生成されます。

その場合は、randomジェネレーターへの呼び出しごとに新しいクラス プロパティを作成する代わりに、クラス プロパティを作成することで修正できます。

于 2013-01-17T19:21:25.687 に答える