Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 4.0 如何配置Pex以遵守代码契约?_.net 4.0_Code Contracts_Pex_Visual Studio 2010 - Fatal编程技术网

.net 4.0 如何配置Pex以遵守代码契约?

.net 4.0 如何配置Pex以遵守代码契约?,.net-4.0,code-contracts,pex,visual-studio-2010,.net 4.0,Code Contracts,Pex,Visual Studio 2010,给定以下示例代码,我如何配置Pex以遵守我的代码契约 public static IEnumerable<User> Administrators(this UserGroup userGroup) { Contract.Requires(userGroup != null); Contract.Requires(userGroup.UserList != null); return userGroup.UserLis

给定以下示例代码,我如何配置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);
    }
公共静态IEnumerable管理员(此用户组用户组)
{
Contract.Requires(userGroup!=null);
Contract.Requires(userGroup.UserList!=null);
返回userGroup.UserList.Where(ul=>ul.IsAdmin==true);
}
当前问题:当我运行Pex时,它仍然在生成违反指定代码约定的测试用例

仅供参考:在我的csproj文件中



编辑:做了什么?

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

Pex所做的是编写违反约定的测试,以便在抛出异常时通过


TL/DR您不必担心它。

首先,您需要使用一个键入的版本

将ArgumentNullException用作T

此外,在项目属性中,您需要告诉代码摘要使用标准重写器。不要单击失败时断言;)

Contract.Requires(i!=null);
然后,您的代码将抛出一个argumetn null异常,pex可以向您的pexmethod添加一个属性,表示允许抛出该异常,并将创建一个抛出该异常的通过测试


然后可以升级这些测试并保存单元测试

我也遇到了同样的问题。有两件事:

1) 检查是否启用了运行时重写(正如John所建议的)

2) 确保您的测试类使用[PexClass(typeof(MyClass))]

我已经手工编写了测试,所以我忘记了Pex类属性和契约被Pex视为常规异常,所以它们失败了


Honza

我还必须打开
合同引用程序集
构建
(我还发出了XML文档文件,以便在VS中查看合同)


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

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

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

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

还有相关的
PexAllowedContractRequiresFailureAtTypeUnderTestSurface
,如果您希望Pex尊重的“需求”在呼叫树中的位置更深,我认为这可能会有所帮助。

您是否尝试过发电子邮件给他们?pexbug@microsoft.comI我认为这是一个错误。约翰·尼古拉斯(John Nicholas)的解决方案是可行的,但对于PEX来说,它仍然不是正确的行为。在pex中使用代码契约的意义在于,pex会自动选择代码契约,并将其失败视为预期行为或通过测试。感谢您提供的信息,Bryan。只是好奇-有没有一种方法可以让Pex预期异常,并在违反合同时将测试标记为绿色?如果合同抛出断言或异常,Pex应该在违反合同时自动将测试标记为绿色。应该这样做,但我认为当前的实现被破坏了。我现在有一个问题@约书亚·戴尔:@johnnicholas解决方案对我有效。请试一试。这是一个修正,但它仍然不是正确的行为。测试应该自动获取代码契约,并将失败视为预期行为。+1:非常感谢!!那个“失败后断言”的设置让我大吃一惊。是的,我自己在那个设置上花了几个小时把脸砸在键盘上;)我认为这是一种变通办法,而不是解决办法。我认为这个解决方案可能无法检测到真正的“ArgumentNullException”,这可能是从测试代码的其他地方抛出的。在我的回答中,我提出了一个没有这个问题的替代解决方案。不同意,因为这段代码也会处理它的异常。。然后,这将以合约的形式出现。
[TestClass]
public partial class MyTest
{
   [PexMethod]
   [PexAllowedContractRequiresFailure]
   public void TestMethod(int myParam)
   {
      Contract.Requires(myParam > 5);
      ...
   }
}