我想从NUNIT 2.x升级到3.x,但我有像
这样的测试[TestCase("12345", ExpectedResult = "SUCCESS")]
[TestCase("invalidkey", ExpectedException = typeof(ArgumentException))]
[TestCase(null, ExpectedException = typeof(ArgumentNullException))]
public string ReturnsStatus(string filePath)
{
// Arrange
// Act
Tuple<string, string> result = service.Create(filePath);
// Assert
return result.Item1;
}
如何重写这种测试? NUNIT 3.x没有ExpectedException,这是我的重构原因。我不想分成3个测试。 感谢。
答案 0 :(得分:2)
正如您所发现的那样,NUnit 3删除了ExpectedExceptionAttribute
以及TestCaseAttribute
和TestCaseData
上的相关属性。
这是在经过大量社区讨论后完成的,协议不到100%,但大多数人都认识到在整个测试阶段广泛检测异常构成反模式。您的示例实际上代表了一种不是一种不好的做法的情况:只有一个语句的测试方法。不幸的是,你也受到了这种变化的影响。
两条建议:
1.对“快乐路径”和错误进行单独测试。
2.使用Assert.Throws
或Assert.That(..., Throws...)
进行错误测试。
答案 1 :(得分:1)
我认为&#34;一种方法==一次测试&#34;是最佳实践:
[TestCase("12345", ExpectedResult = "SUCCESS")]
public string ReturnStatusTest_SUCCESS()
{
return ReturnsStatus("12345");
}
[TestCase("invalidkey", ExpectedException = typeof(ArgumentException))]
public string ReturnStatusTest_SUCCESS()
{
return ReturnsStatus("invalidkey");
}
[TestCase(null, ExpectedException = typeof(ArgumentNullException))]
public string ReturnStatusTest_SUCCESS()
{
return ReturnsStatus(null);
}
public string ReturnsStatus(string filePath)
{
// Arrange
// Act
Tuple<string, string> result = service.Create(filePath);
// Assert
return result.Item1;
}
答案 2 :(得分:0)
这是一个古老的问题,但是无论如何...
如前所述,ExpectedException被认为是一种不好的做法,因为您无法确定测试的确切部分会引发异常(在您的代码中可以是Create()或get_Item1())。
但是,您不需要为每种情况编写单独的测试方法。在大多数情况下(在您的示例中),有两种测试是肯定的,正负测试。积极的情况可以保持不变。否定情况可以使用预期异常的类型作为参数,以便:
[TestCase("", typeof(ArgumentException))]
[TestCase(null, typeof(ArgumentNullException))]
public void ReturnStatusInvalidArgument(string filePath, Type expectedException)
{
Assert.Throws(expectedException, () => Method(filePath));
}
或者,如果您喜欢“ ExpectedResult”样式,则可以使用以下
[TestCase("", ExpectedResult = typeof(ArgumentException))]
[TestCase(null, ExpectedResult = typeof(ArgumentNullException))]
public Type ReturnStatusInvalidArgument(string filePath)
{
return Assert.Catch(() => Method(filePath)).GetType();
}