0

私は次の方法を持っています:

public static DateTime SubQtrs( this DateTime dt, int qtrs )
{
    Contract.Requires( qtrs > -1 );
    Contract.Requires( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 );
              // do something
     }

パラメーター化された単体テストを作成し、Pex を使用して単体テストを作成しました。予想どおり、Pex はコントラクトの制約をテストし、コントラクトに違反する qtrs 値を渡しました。[ExpectedException(typeof(TraceAssertionException))] で例外を予期するように単体テストに指示し、すべてが合格しました。

MS テスト ハーネス (Pex なし) を使用して単体テストを実行すると、次のエラーが表示されます。

基本的に、contracthelper が失敗したことを示すスタック トレースが表示されます。次に、中止、再試行、無視のいずれかを選択できます。

いずれにせよ、テストは失敗し、次のようになります。例外メッセージ: System.ArgumentOutOfRangeException: 月の値は +/-120000 の間である必要があります。...

単体テストでコード コントラクト エラーが認識されなくなったのはなぜですか?

4

2 に答える 2

0

単体テストを手動で実行するときに、アセンブリでコントラクト リライターを実行していないように思われるため、Requires コントラクトで例外が発生することはありません。代わりに、メソッド内に ArgumentOutOfRangeException をスローする手動チェック コードがあるように思えますが、これは正しい動作 (実行時、コントラクトの書き換えなし) ですが、テストで予想される例外と一致しません。Code Contracts リライタがインストールされていることを確認し、プロジェクト設定に例外を伴うリライトが含まれていることを確認してください。

または、Exception 型を指定する Requires オーバーロードを使用して、内部チェックと一致するようにします。この場合、書き換えを使用する予定があることがわかっている限り、他の明示的な例外を削除することもできます。

Contract.Requires<ArgumentOutOfRangeException>( ( qtrs * 3 ) >= -120000 && ( qtrs * 3 ) <= 120000 , "qtrs");
于 2011-12-12T21:11:24.463 に答える
0

その画面をスローしていたテストに [HostType("Moles")] がなかったようです。

問題を引き起こしているテストと、トレース アサーションをスローするはずで問題を引き起こしていない別のテストを比較しました。唯一の違いは、問題の原因となっている [HostType("Moles")] が欠落していたことです。その属性を追加するとすぐに、テストが機能しました。

契約に関するエラーがどこかから発生し、私を野生のガチョウの追跡に送ったに違いありません。

残りのテスト シナリオにほくろを追加し始める前に、Pex がそのテストを作成したに違いありません。

于 2012-01-04T03:14:41.880 に答える