在NUnit测试期间的拆解事件中,如何获取应用于刚测试的方法的属性?

问题描述 投票:3回答:4

我有一个运行的测试方法。当该方法生成异常时,我想知道测试的名称和异常内容。

在测试的拆解中,我希望能够访问这些信息。如何从[TearDown]归因方法访问它?

c# nunit
4个回答
0
投票

选项1:我认为你不能。或者说,我不知道你可以。我如何处理这种需求是在特定测试中使用try / catch,使用异常执行我想要的操作,然后再次在catch块中抛出,以便测试可能失败。

try{
    // do something that can potentially throw;
}
catch(Exception ex){
    // do something interesting with the ex;
    throw;
}

选项2:如果你没有走得太远,你可能想要使用具有不同异常期望模型的xUnit,并且可能提供你正在寻找的一些控件。


2
投票

我不认为nunit有一个很好的方法,但解决这个问题不是一个难题。只需将测试包装在try / catch块中,捕获任何异常,并将它们(和测试名称)保存到测试类中的私有成员变量中。然后您就可以从TearDown方法访问了。

不是特别优雅,但它的工作原理。


1
投票

另一种解决方案是使用模板方法并使用此方法运行所有测试。例如:

// template method
void Execute(Action test)
{
    try
    {
        test();
    }
    catch (Exception e)
    {
        // handle exception here
        throw;
    }
}

[Test]
public void Test()
{
    Execute(() =>
        {
            // your test here
        });
}

当您的测试使用一些必须在测试之前初始化并在测试之后处理的资源(例如临时文件)时,此模式特别有用。在这种情况下,您可以在测试委托中使用类型参数。

另一个优点是您可以轻松地让测试在不同的线程上运行,使用不同的文化等。

缺点很明显:它迫使你在每次测试中使用lambda方法。


1
投票

您可以在测试拆卸方法中访问文本上下文对象

[TearDown]
public void TestTearDown()
{
  // inc. class name
  var fullNameOfTheMethod = NUnit.Framework.TestContext.CurrentContext.Test.FullName; 
  // method name only
  var methodName = NUnit.Framework.TestContext.CurrentContext.Test.Name;
  // the state of the test execution
  var state = NUnit.Framework.TestContext.CurrentContext.Result.State; // TestState enum
}

我不知道哪个版本是第一个支持它,但我的是24。

© www.soinside.com 2019 - 2024. All rights reserved.