NUNIT 3和ExpectedException

时间:2018-02-16 11:58:42

标签: c# nunit

我想从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个测试。 感谢。

3 个答案:

答案 0 :(得分:2)

正如您所发现的那样,NUnit 3删除了ExpectedExceptionAttribute以及TestCaseAttributeTestCaseData上的相关属性。

这是在经过大量社区讨论后完成的,协议不到100%,但大多数人都认识到在整个测试阶段广泛检测异常构成反模式。您的示例实际上代表了一种不是一种不好的做法的情况:只有一个语句的测试方法。不幸的是,你也受到了这种变化的影响。

两条建议: 1.对“快乐路径”和错误进行单独测试。 2.使用Assert.ThrowsAssert.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();
    }