2013-01-17 90 views
0

我有以下的單元測試:單元測試只傳遞在調試模式下,無法在運行模式

[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是在類的屬性,其數據類型是字典關鍵整數,整數的值列表。 SECRETCODE也對類的屬性,其數據類型是整數

列表如果我是做一個猜測,我會說的原因是NewGame()方法再次被調用,而第一個電話並沒有真正完成它需要做的事情。如您所見,還有其他方法在NewGame()方法中調用(例如generateRequiredSecretCode())。

在調試模式下運行時,我按下F10的速度緩慢,給進程結束足夠的時間。

但我真的不知道如何解決這個問題,假設我正確地找出原因。

回答

0

generateRequiredSecretCode產生重複時,SecretCode會發生什麼?它似乎是未經處理的。

一種可能性是您得到一個重複,所以SecretCode保持與以前的值相同。發生器如何工作?

此外,你沒有顯示如何BullsAndCows構造函數初始化SecretCode?它是否叫NewGame?

我懷疑按鍵的速度與它有什麼關係,因爲你的測試方法輪流調用函數而不需要等待輸入。除非generateReq...產生一個線程,否則它將在它返回之前完成它正在做的任何事情。

- 更新後 -

我看到2個錯誤。
1)構造函數中生成的第一個SecretCode未添加到​​的列表中。所以如果第二款遊戲具有相同的代碼,重複檢查將不會被捕獲。
2)在填充​​後,您不處理產生重複的情況。之前有一個副本,所以您不要將其添加到​​列表中,但您也不更新SecretCode,因此它保留了舊值。

我不完全確定爲什麼這只是在釋放模式下顯示 - 但它可能是調試模式處理隨機數生成器的方式不同。請參閱How to randomize in WPF。發佈模式更快,因此它使用與種子相同的時間戳,所以它確實生成完全相同的數字序列。

如果是這樣的話,你可以通過random類屬性,而不是創建每次調用生成一個新的解決它。

+0

該方法的代碼可以在這裏找到[http://pastebin.com/UNdYQvVy]。正如你所看到的,它不會創建一個三位數字(我需要的),其中有重複的數字(例如882 <壞),但是(392好)。 – Ciwan

+0

已更新爲顯示構造函數。我明白你的意思是重複的嗎?還是我錯了? – Ciwan

+0

我的意思是它在第一次呼叫時產生'123',例如在第二次呼叫時產生'123'。 – AShelly

相關問題