4

私のコードは、正しい「はず」のデータを操作します。ただし、開発中に無効なデータを取得する場合があります。
その場合、デバッグ アサートを発生させたいと思います。ユーザーが続行することを選択した場合、コードは無効なレコードを除外し、「安全な」データの操作を続行します。

// 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)));

フィルタリングされたデータを操作することを選択したときに、コード パスを単体テストしたいと考えています。

質問:単体テストで assert 呼び出しを通過する方法はありますか? 「Assertion Failed」ダイアログ
をクリックするのと同じですか?OK=Continue

ティア

4

2 に答える 2

10

SLaksの答えに加えて、あなたがやりたいことは論理的に矛盾していると付け加えます。assert は、false になる可能性がない条件を文書化するために使用する必要があります。false の状態が発生した場合は、バグがあることがわかります。assert の目的は、(1) コードのこの時点で真でなければならないことを読者に説明する一種のコメントとして、(2) バグがあるときにそれを知らせるデバッグ支援としてです。

正しいコード内の正しいアサートは起動しないため、アサートの起動をテストする方法はありません。テストの前提は、ソフトウェアの可能な構成を生成し、その正確性を検証することです。ただし、正しいアサートを含む正しいコードには、アサートが発生する構成はありません。

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

この関連する質問も参照してください。

Debug.Assert と例外のスロー

于 2011-02-03T15:19:19.860 に答える
6

これには使用しないでくださいDebug.Assert
Debug.Assertデバッグ支援としてのみ使用することを意図しています。
リリース モードではまったくコンパイルされません。

代わりに、独自のメソッドを作成する必要があります。これにより、ユーザーによりシンプルなダイアログ ボックスが表示され、単体テストを常に続行するように構成できます。(例:public static bool ShowWarningsプロパティを使用)

于 2011-02-03T13:43:20.720 に答える