当我创建一个调用被测类的方法的 PUT 并将其属性为 时PexMethod
,“Run Pex”将使用此方法并为其创建自动生成的测试。
这仅在对方法的调用直接在 PUT 的主体中时才有效。
样本:
此 PUT 由“运行 Pex”使用:
[PexGenericArguments(typeof(string))]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
[PexMethod]
public string Convert01_ConverterForTypeNotRegistered<T>(
[PexAssumeUnderTest] ToStringConverter target, T objectToConvert)
{
var result = "";
result = target.Convert(objectToConvert);
return result;
}
“运行 Pex”不使用此 PUT :
[PexGenericArguments(typeof(string))]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
[PexMethod]
public string Convert01_ConverterForTypeNotRegistered_ThrowsInvalidOperationException<T>(
[PexAssumeUnderTest] ToStringConverter target, T objectToConvert)
{
var result = "";
PexAssert.Throws<InvalidOperationException>(() => target.Convert(objectToConvert));
return result;
}
我想表明对方法的调用总是抛出这个异常,与参数无关。
如何做到这一点?
一周前我已经在微软的官方 Pex 论坛上问过这个问题,但没有收到一个答案,因此我在这里做一个双重发布。
该问题可以重现如下:
- 有一个简单的解决方案,一个项目,一个类,一种方法。
- 右键单击该方法并选择运行 Pex。
- 在 Pex 探索结果中,右键单击任何条目并选择“保存测试...”。它将创建一个包含两个相关文件的新测试项目:
<class-name>Test.cs
和<class-name>Test.<MethodName>.g.cs
. 在第一个文件中,有 PUT,在第二个文件中是具体的测试方法,每个参数 Pex 选择一个。每次为第一个文件中包含 PUT 的方法运行 pex 时,都会自动重新创建第二个文件。 - 右键单击测试项目并选择“Pex”->“删除生成的单元测试”。这将从第二个文件中删除特定测试。
- 转到带有 PUT 的文件并将 PUT 重命名为任意名称。
- 返回到第 1 点的方法并再次右键单击并选择运行 Pex。
- Pex 将在名为“Test..g.cs”的测试项目中创建一个新文件。它使用与以前相同的 PUT,尽管您对其进行了重命名。
- 再次更改 PUT,保持名称不变,但将内容更改为我使用 PexAssert.Throws 的第二个示例。
- 再次,右键单击测试项目并选择“Pex”->“删除生成的单元测试”。
- 再次,右键单击第 1 点的方法并选择“运行 Pex”
- 打开测试项目中的两个 *.g.cs 文件,您将看到没有测试。这意味着,Pex 没有使用 PUT。那就是问题所在 :)