2011-02-03 65 views
4

我的代碼對「應該」正確的數據進行操作。但是在開發過程中,我有時會收到無效數據。
當發生這種情況時,我想提出調試斷言,如果用戶選擇繼續,代碼將過濾掉無效記錄並繼續操作「安全」數據。有沒有辦法如何從代碼Debug.Assert()後繼續?

// assert incorrect data 
Debug.Assert(person.Items.All(item => item.IsValid), "Inconsistent data!"); 

// operate on filtered data 
this.ItemViewModels = new ObservableCollection<ItemViewModel>(
          person.Items 
            .Where(i =>item.IsValid) // Use only correct data 
            .Select(i => new ItemViewModel(lang, i))); 

我想單元測試代碼路徑,當我選擇操作過濾的數據。

問題:有沒有辦法在單元測試中通過斷言調用?
部分等同於在「聲明失敗」對話框中點擊OK=Continue

TIA

回答

6

,則不應使用Debug.Assert這一點。
Debug.Assert僅用作調試幫助。
它在發佈模式下根本不會被編譯。

相反,您應該創建自己的方法,它將向用戶顯示一個更簡單的對話框,並且可以將其配置爲始終繼續執行單元測試。 (例如,使用public static bool ShowWarnings財產)

10

除了SLaks的答案我會補充說,你想要做的是邏輯不一致。斷言應該用來記錄一個條件,即不可能是錯誤的。如果出現錯誤的情況,那麼你知道你有一個bug;斷言的目的是(1)作爲一種評論,向讀者描述代碼中的這一點必須是真實的;(2)調試助手,告訴你什麼時候有bug。

由於正確的斷言在正確的代碼從未火,沒有辦法來測試斷言射擊。測試的前提是它會產生一個可能的軟件配置並驗證其正確性;但正確的代碼與正確的斷言從來沒有有一個配置的斷言觸發。

這聽起來像你正在使用斷言沒有記錄的東西,你知道真正而是東西,你希望是真的還是通常如此。不要爲此使用斷言。如果程序有任何輸入導致斷言被違反,那麼您需要刪除斷言,或者在得到無效數據時導致異常,以便斷言永遠不會看到它。斷言旨在記錄什麼必須是真的,而不是大部分時間是真的。

又見此相關的問題:

Debug.Assert vs Exception Throwing

相關問題