C# NUnit-是否可以在拆卸中检查测试是否成功?

C# NUnit-是否可以在拆卸中检查测试是否成功?,c#,.net,nunit,C#,.net,Nunit,我想让我的拆卸方法在应用一些逻辑之前检查上一个测试是否成功。有没有一种简单的方法可以做到这一点?听起来像是一个危险的想法,除非它是一个集成测试,用say数据来删除say。为什么不在考试中做呢 显然,可以在类中设置私有标志 如果您必须手动执行此操作,则这就是他自己所做的。事实上,您甚至不知道要运行哪些测试。在NUnitIDE中,可以启用一些测试,禁用另一些测试。如果您想知道某个特定测试是否已运行,可以在测试类中包含如下代码: enum TestStateEnum { DISABLED, FAILE

我想让我的拆卸方法在应用一些逻辑之前检查上一个测试是否成功。有没有一种简单的方法可以做到这一点?

听起来像是一个危险的想法,除非它是一个集成测试,用say数据来删除say。为什么不在考试中做呢

显然,可以在类中设置私有标志


如果您必须手动执行此操作,则这就是他自己所做的。事实上,您甚至不知道要运行哪些测试。在NUnitIDE中,可以启用一些测试,禁用另一些测试。如果您想知道某个特定测试是否已运行,可以在测试类中包含如下代码:

enum TestStateEnum { DISABLED, FAILED, SUCCEDED };
TestStateEnum test1State = TestStateEnum.DISABLED;

[Test]
void Test1()
{
test1State =  TestStateEnum.FAILED; // On the beginning of your test
...
test1State =  TestStateEnum.SUCCEDED; // On the End of your Test
}
然后可以检查test1State变量。如果测试抛出异常,它将不会设置succeeded。您还可以在测试中使用稍微不同的逻辑将其放入try-catch-finally块中:

[Test]
void Test1()
{
test1State =  TestStateEnum.SUCCEDED; // On the beginning of your test
try
{
    ... // Your Test
}
catch( Exception )
{
   test1State =  TestStateEnum.FAILED;
   throw; // Rethrows the Exception
}
}

IMHO拆卸逻辑应独立于测试结果


理想情况下,您应该避免完全使用安装和拆卸,即al-xunit.net。有关更多信息,请参阅。

这已在类似的SO问题中得到解决。引用Ran的话:

自版本2.5.7以来,NUnit允许拆卸检测上次测试是否失败。 一个新的TestContext类允许测试访问关于自身的信息,包括TestStatus

有关详细信息,请参阅


如果要使用拆卸来检测NUnit 3.5最后一次测试的状态,则应为:

[TearDown]
 public void TearDown()
 {
   if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed)
   {
      //your code
   }
 }

一般来说,这绝对是你应该做的。然而,我喜欢保持我的测试干净,具有BDD风格。有时,这意味着通过lambdas设置givens和asserts,并在拆卸中执行它们。问题是,如果由于某种原因安装或测试主体失败,stacktrace会令人困惑。这不是试图告诉运行了哪个测试,只是我想抛出一个不同的错误,以便获得更准确的stacktrace。此解决方案的问题是,每个测试都必须编辑。它无法缩放。请参阅,以获得一个通用的解决方案。这让人感到不安,我本来希望得到某种NUnit.CurrentTestContext API。我只需要知道测试是否成功,因为如果测试失败,我可以在此夹具中提供其他信息,这将有助于调试。感谢链接。请注意,这个问题是在David给出答案前一年半发布的。在Nunit 3.x中,如果(TestContext.CurrentContext.Result.Output==ResultState.Failure)您可以更改已接受的答案吗,因为它在Nunit 3.x中已更改?
[TearDown]
 public void TearDown()
 {
   if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed)
   {
      //your code
   }
 }
    [OneTimeTearDown]
    public void AfterEachTest()
    {
        if (TestContext.CurrentContext.Result.Outcome.Status.Equals(TestStatus.Failed))
        {
           Console.WriteLine("FAILS");

        }
        else if (TestContext.CurrentContext.Result.Outcome.Equals(ResultState.Success))
        {
            Console.WriteLine("SUCESS");

        }
    }