.net 4.0 如何配置Pex以遵守代码契约?
给定以下示例代码,我如何配置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
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);
...
}
}