代码之家  ›  专栏  ›  技术社区  ›  Tigraine

在nUnit中预期异常,但不具有ExpectedException属性

  •  3
  • Tigraine  · 技术社区  · 16 年前

    多个参数 通过在任何参数为null时抛出ArgumentNullException和ArgumentException来防止错误输入。

    • 使用多个try{}catch块对所有参数进行一次测试

    try 
    {
        controller.Foo(null, new SecondParameter());
        Assert.Fail("ArgumentNullException wasn't thrown");
    } catch (ArgumentNullException)
    {}
    

    有一个小问题。如果测试通过,则永远不会调用Assert.Fail,因此将突出显示为未覆盖的测试代码(由NCover)。

    我知道这实际上不是问题,因为这是我想要100%覆盖率的业务代码,而不是测试代码。我仍然很好奇,是否有一种方法可以将多个异常抛出调用压缩到一个测试用例中,而不会出现死LOC?

    2 回复  |  直到 16 年前
        1
  •  7
  •   Jon Skeet    16 年前

    好吧,你可以通过提取一个实用的方法把它简化为一条死线,例如。

    public void ExpectException<T>(Action action) where T : Exception
    {
        try
        {
            action();
            Assert.Fail("Expected exception");
        }
        catch (T)
        {
            // Expected
        }
    }
    

    称之为:

    ExpectException<ArgumentNullException>
        (() => controller.Foo(null, new SecondParameter());
    

    (当然,您不需要将其封装在IDE中……SO上的行长度非常短。)

        2
  •  6
  •   Noctis    10 年前

    release notes of NUnit 2.4.7 NUnit现在在它的扩展程序集中包含由Andreas Schlapsi编写的RowTest扩展。此扩展允许您编写接受参数的测试方法,并使用RowAttribute提供多组参数值。若要使用RowTest,测试必须引用nunit.framework.extensions程序集。

    你可以这样写:

    [RowTest]
    [Row(1, 2, 3)]
    [Row(3, 4, 8, TestName="Special case")]
    [Row(10, 10, 0, TestName="ExceptionTest1"
        , ExpectedException=typeof(ArgumentException)
        , ExceptionMessage="x and y may not be equal.")]
    [Row(1, 1, 0, TestName="ExceptionTest2"
        , ExpectedException=typeof(ArgumentException)
        , ExceptionMessage="x and y may not be equal.")]
    public void AddTest(int x, int y, int expectedSum)
    {
      int sum = Sum(x, y);
      Assert.AreEqual(expectedSum, sum);
    }
    

    http://www.andreas-schlapsi.com/2008/03/31/nunit-247-includes-rowtest-extension/ Google code