我正在寻找一种在NUnit项目类库中全局捕获异常的方法。因此,如果我的一个单元测试引发异常,那么我可以一举抓住它。我不想用try / catch块包围每个测试。我这样做的原因是要打印一个不错的错误消息,并带有堆栈跟踪的解释。在ASP.NET中,它们在Global.asax中有一个称为Application_Error的方法,可以执行这种操作。

#1 楼


您可以创建一个偶数侦听器:
EventListeners(NUnit 2.4.4)


Interface

传递给Install的扩展对象必须实现EventListener接口:

public interface EventListener
{
    void RunStarted( string name, int testCount );
    void RunFinished( TestResult result );
    void RunFinished( Exception exception );
    void TestStarted(TestName testName);
    void TestFinished(TestResult result);
    void SuiteStarted(TestName testName);
    void SuiteFinished(TestResult result);
    void UnhandledException( Exception exception );
    void TestOutput(TestOutput testOutput);
}



您可以使用委托(lambda表达式)和闭包使try / catch块不那么难看。

它的工作原理是:

    public void Try(Action testCode)
    {
        try
        {
            testCode();
        }
        catch (Exception e)
        {
            Console.WriteLine("Nice Error Here: " + e.Message);
        }
    }

    [Test]
    public void TestO1()
    {
        int actual = 5;
        int expected = 4;
        Assert.AreEqual(expected, actual);
    }

    [Test]
    public void TestO2()
    {
        int actual = 5;
        int expected = 4;
        Try( () => Assert.AreEqual(expected, actual) );
    }


方法Try接受代码作为参数,并在try块中执行它。因此,在catch块中,您可以应用任何必要的格式。

方法TestO1只是一个普通的单元测试,没有任何技巧。

TestO2的断言用方法Try:

Try( ()=>此处的任何代码行);

这将是相同的try / catch,但现在我不需要编写很多难看的代码。

#2 楼

EventListener是必经之路。但是,有一个技巧:测试中的断言失败时,不会触发UnhandledException。而是使用TestFinished事件来处理失败的测试:

public void TestFinished(TestResult result)
{
    if (result.Executed && result.IsFailure)
    {
        Console.WriteLine(string.Format("Failure in test {0}", result.Name));
        Console.WriteLine(result.Message);
    }
}