2011-02-03 10 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の回答に加えて、論理的に矛盾していることを追加します。 が間違っている可能性がないという条件を文書化するには、アサーションを使用する必要があります。偽の状態が発生した場合、あなたはバグがあることを知っています。アサーションの目的は、(1)コードのこの時点で真実でなければならないことを読者に説明するコメントの一種と、(2)バグがある時を知らせるデバッグ支援です。

正しいは正しいコードに決して火災、を発射アサートをテストする方法はありませんがアサートので。テストの前提は、ソフトウェアの構成を可能にし、その正確性を検証することです。正しいコードで正しいコードが返されるneverには、アサートが発生する構成があります。

あなたはは本当ではなく、あなたが希望が真であるか、通常真で何か知っている何かを文書化していないアサートを使用しているように聞こえます。アサーションを使用しないでください。アサーションに違反するプログラムへの入力がある場合は、アサーションを削除するか、アサーションでそれが見られないように無効なデータを取得したときに例外を発生させる必要があります。アサーションは、が真でなければならないことを文書化することを意図しています。ほとんどの場合、真実ではありません。

Debug.Assert vs Exception Throwing

も、この関連の質問を参照してください

関連する問題