鉴于以下示例代码,我如何配置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文件中的Here are the 'Code Contracts' settings。
编辑:做了什么break in SP1?
答案 0 :(得分:4)
首先,您需要使用类型版本的Requires
使用ArgumentNullException作为T
同样在项目属性中,您需要告诉代码cotracts使用标准重写器。不要在失败时点击断言;)
Contract.Requires<ArgumentNullException>(i != null);
那么你的代码将抛出一个argumentmetn null异常,pex可以为你的pex方法添加一个属性来说它允许抛出它并创建一个抛出异常的传递测试
然后你可以宣传那些并保存单元测试
答案 1 :(得分:3)
违反有意合同以验证违反合同时抛出异常。很多人会在Release版本中编译Requires方法,有些人会说边缘案例仍应处理。也可以编写一个自定义合同失败处理程序,它可能不会抛出异常或断言失败。如果您有一个不会阻止进一步执行的自定义合同失败处理程序,则可能会导致更大的问题进一步发生。
Pex所做的是编写违反合同的测试,以便在抛出异常时通过。
TL / DR 您不必担心。
答案 2 :(得分:1)
我遇到了同样的问题。有两件事:
1)检查是否启用了运行时重写(如John建议的那样)
2)确保您的测试类使用[PexClass(typeof(MyClass))]
进行修饰我已手动编写测试,因此我忘记了PexClass属性和合同被Pex视为常规例外 - 因此它们失败了。
洪扎
答案 3 :(得分:1)
我还必须打开Contract Reference Assembly
到Build
(我还发布了XML doc文件,这样我就可以看到VS中的合同了。)
这似乎是Pex了解合同的必要条件。
答案 4 :(得分:0)
有一个属性PexAllowedContractRequiresFailure
可以装饰你的测试方法,以告诉Pex不要生成导致需求失败的测试。
您还必须在解决方案属性中启用“执行运行时合同检查”。
[TestClass]
public partial class MyTest
{
[PexMethod]
[PexAllowedContractRequiresFailure]
public void TestMethod(int myParam)
{
Contract.Requires(myParam > 5);
...
}
}
如果您希望Pex尊重的“需要”在调用树中更深入,我认为还有相关的PexAllowedContractRequiresFailureAtTypeUnderTestSurface
。