7

次のコード例の場合、コード コントラクトを尊重するように Pex を構成するにはどうすればよいですか?

    public static IEnumerable<User> Administrators(this UserGroup userGroup)
    {
        Contract.Requires(userGroup != null);
        Contract.Requires(userGroup.UserList != null);

        return userGroup.UserList.Where(ul => ul.IsAdmin == true);
    }

現在の問題: Pex を実行すると、指定されたコード コントラクトに違反するテスト ケースがまだ生成されます。

参考: csproj ファイルの「コード コントラクト」設定は次のとおりです。


編集: SP1 で何かが壊れましたか?

4

5 に答える 5

4

まず、型付きバージョンの Requires を使用する必要があります

ArgumentNullException を T として使用する

また、プロジェクトのプロパティでは、標準のリライターを使用するようにコード コトラクトに指示する必要があります。失敗時にアサートをクリックしないでください;)

Contract.Requires<ArgumentNullException>(i != null);

次に、コードはargumetn null例外をスローし、pexはpexmethodに属性を追加して、それをスローできることを示し、例外をスローする合格テストを作成します

その後、それらを昇格させ、単体テストを保存できます

于 2011-06-24T15:18:21.293 に答える
3

契約に違反した場合に例外がスローされることを確認するために、意図的に契約に違反します。多くの人が、リリース ビルドで Requires メソッドをコンパイルして削除しますが、エッジ ケースを引き続き処理する必要があると言う人もいます。例外やアサーションの失敗をスローしない可能性のあるカスタム コントラクト失敗ハンドラーを作成することもできます。さらなる実行を妨げないカスタム コントラクト エラー ハンドラーがある場合、さらに大きな問題が発生する可能性があります。

Pex が行うことは、例外がスローされたときに合格するように、コントラクトに違反するテストを作成することです。

TL/DR気にする必要はありません。

于 2011-05-27T14:09:39.500 に答える
1

私も同じ問題を抱えていました。次の 2 つのことがあります。

1)実行時の書き換えが有効になっていることを確認します(ジョンが提案するように)

2) テスト クラスが [PexClass(typeof(MyClass))] で装飾されていることを確認します。

テストを手動で書いたので、PexClass 属性とコントラクトが Pex によって通常の例外として扱われたことを忘れていたので、失敗していました。

本座

于 2011-12-09T08:59:47.227 に答える
1

また、オンにContract Reference Assemblyする必要がありましたBuild(VSでコントラクトを確認できるように、XMLドキュメントファイルも出力しました)。

これは、Pex がコントラクトを理解するために必要なようです。

于 2013-01-30T22:25:14.453 に答える
0

PexAllowedContractRequiresFailure要件が失敗する原因となるテストを生成しないように Pex に指示するために、テスト メソッドをデコレートできる属性があります。

また、ソリューションのプロパティで「Perform Runtime Contract Checking」を有効にする必要があります。

[TestClass]
public partial class MyTest
{
   [PexMethod]
   [PexAllowedContractRequiresFailure]
   public void TestMethod(int myParam)
   {
      Contract.Requires(myParam > 5);
      ...
   }
}

PexAllowedContractRequiresFailureAtTypeUnderTestSurfacePexに尊重させたい「Requires」がコールツリーのより深い場合に役立つと思われる関連もあります。

于 2013-06-04T22:15:29.297 に答える