当我创建一个调用被测试类的方法的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,但没有得到一个答案,所以我在这里做双重帖。
问题可以像下面这样重现:
<class-name>Test.cs
和<class-name>Test.<MethodName>.g.cs
。在第一个文件中,有PUT,在第二个文件中是特定的测试方法,Pex选择的每个参数都有一个。每次为第一个文件中包含PUT的方法运行pex时,都会自动重新创建第二个文件。答案 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
""
(失败,因为它返回""
)这正是我期望它找到的,所以我没有看到你的问题。