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

它故意违反合同,以验证违反合同时是否引发异常。很多人会在 Release 构建中编译掉 Requires 方法,有些人会说仍然应该处理边缘情况。也可以编写一个自定义的合约失败处理程序,它可能不会抛出异常或断言失败。如果您有一个不会阻止进一步执行的自定义合同失败处理程序,您可能会导致更大的问题进一步发生。

Pex 所做的是编写违反合同的测试,以便在引发异常时通过。

TL/DR你不应该担心它。

于 2011-05-27T14:09:39.500 回答
1

我有同样的问题。有两件事:

1)检查是否启用了运行时重写(正如约翰建议的那样)

2)确保您的测试类装饰有 [PexClass(typeof(MyClass))]

我已经手动编写了测试,所以我忘记了 PexClass 属性并且合同被 Pex 视为常规异常 - 所以它们失败了。

洪萨

于 2011-12-09T08:59:47.227 回答
1

Contract Reference Assembly我还必须打开Build(我还发出了 XML doc 文件,所以我可以在 VS 中看到合同)。

这似乎是 Pex 理解合同所必需的。

于 2013-01-30T22:25:14.453 回答
0

有一个属性PexAllowedContractRequiresFailure,您可以装饰您的测试方法,以告诉 Pex 不要生成导致需求失败的测试。

您还必须在解决方案属性中启用“执行运行时合同检查”。

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

PexAllowedContractRequiresFailureAtTypeUnderTestSurface如果您希望 Pex 尊重的“要求”在调用树中更深,我认为还有相关的可能会有所帮助。

于 2013-06-04T22:15:29.297 回答