PexAssert.Throws在PUT中与Run Pex结合使用

时间:2011-02-24 09:22:22

标签: c# unit-testing pex

当我创建一个调用被测试类的方法的PUT并将其归为PexMethod时,“Run Pex”将使用此方法并为其创建自动生成的测试。

只有对方法的调用直接在PUT的主体中时,这才有效。

样品:

此PUT由“Run 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”使用

[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;
}

我想表明对方法的调用总是抛出此异常,与参数无关。

如何实现这一目标?

我已经在question一周前问了official Pex forum of Microsoft,但没有得到一个答案,所以我在这里做双重帖。

问题可以像下面这样重现:

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

1 个答案:

答案 0 :(得分: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
      • ""(失败,因为它返回""

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