1

当我创建一个调用被测类的方法的 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 论坛上问过这个问题,但没有收到一个答案,因此我在这里做一个双重发布。

该问题可以重现如下:

  1. 有一个简单的解决方案,一个项目,一个类,一种方法。
  2. 右键单击该方法并选择运行 Pex。
  3. 在 Pex 探索结果中,右键单击任何条目并选择“保存测试...”。它将创建一个包含两个相关文件的新测试项目:<class-name>Test.cs<class-name>Test.<MethodName>.g.cs. 在第一个文件中,有 PUT,在第二个文件中是具体的测试方法,每个参数 Pex 选择一个。每次为第一个文件中包含 PUT 的方法运行 pex 时,都会自动重新创建第二个文件。
  4. 右键单击测试项目并选择“Pex”->“删除生成的单元测试”。这将从第二个文件中删除特定测试。
  5. 转到带有 PUT 的文件并将 PUT 重命名为任意名称。
  6. 返回到第 1 点的方法并再次右键单击并选择运行 Pex。
  7. Pex 将在名为“Test..g.cs”的测试项目中创建一个新文件。它使用与以前相同的 PUT,尽管您对其进行了重命名。
  8. 再次更改 PUT,保持名称不变,但将内容更改为我使用 PexAssert.Throws 的第二个示例。
  9. 再次,右键单击测试项目并选择“Pex”->“删除生成的单元测试”。
  10. 再次,右键单击第 1 点的方法并选择“运行 Pex”
  11. 打开测试项目中的两个 *.g.cs 文件,您将看到没有测试。这意味着,Pex 没有使用 PUT。那就是问题所在 :)
4

1 回答 1

0

我刚刚尝试在 Visual Studio 2010 中运行您的两个示例。我将第二个示例更改为使用名为 的类ThrowingConverter,这些是我的愚蠢实现:

public class ToStringConverter {
    internal string Convert(object objectToConvert) {
        return objectToConvert.ToString();
    }
}

public class ThrowingConverter {
    internal string Convert(object objectToConvert) {
        if (objectToConvert is string) {
            return (string)objectToConvert;
        }
        throw new InvalidOperationException();
    }
}

我运行了 Pex,它提出了以下测试用例:

  • ToStringConverter
    • int
      • 0
      • 1
    • string
      • null(失败NullReferenceException
      • ""
    • object
      • null(失败NullReferenceException
      • new object()
  • ThrowingConverter
    • int
      • 0
    • string
      • null
      • ""(失败,因为它返回""
    • object
      • null
      • ""(失败,因为它返回""

这正是我期望它找到的,所以我真的没有看到你的问题。

于 2011-03-22T20:57:22.383 回答