代码之家  ›  专栏  ›  技术社区  ›  Paul Mendoza

如何编写NUnit单元测试,而不必用try-catch语句包围它们?

  •  2
  • Paul Mendoza  · 技术社区  · 15 年前

    在我的公司,我们正在编写一系列单元测试。我们想做的是执行单元测试,当一个测试成功或失败时,我们可以把它写在某个地方,但我们不想把逻辑放在每个测试中。

    你知道我们如何编写测试而不必用我们一直使用的try-catch逻辑包围测试内容吗?

    6 回复  |  直到 15 年前
        1
  •  3
  •   Wim Coenen    15 年前

    我猜你是这样做的:

    [Test]
    public void FailBecauseOfException()
    {
       try
       {
          throw new Exception();
       }
       catch (Exception e)
       {
          Assert.Fail(e.Message);
       }
    }
    

    没必要这样。如果测试抛出异常,测试将自动失败。例如,以下测试将显示为失败:

    [Test]
    public void FailBecauseOfException()
    {
       throw new Exception();
    }
    
        2
  •  2
  •   Rob Levine    15 年前

    我不太清楚你想在这里做什么。您是说您将它包装在try/catch中,以便在发生异常时捕获并记录它吗? 如果是这样,那么一个更好的方法,可能就是让NUnit写一个输出文件并使用它。我已经有一年没有使用NUnit了,但是IIRC可以使用/out指令将其输出重定向到任何您喜欢的文件。

    如果你有理由 若要按您所说的方式记录它,则必须将自定义代码添加到每个测试中,或者有一个通用的“运行器”,它将您的代码(对于每个测试)作为匿名方法并在单个try..catch中运行。这样你就不必每次测试都重复尝试。

    如果我误解了这个问题,请道歉。

        3
  •  2
  •   Samuel Carrijo    15 年前

    MSTest有TestCleanup,它在每次测试之后运行。在NUnit中,要使用的属性是 TearDown (每次测试后)或 TestFixtureTearDown (在所有测试完成后)。这在每次测试结束后执行。

    如果希望在测试通过的情况下运行某些内容,则可以有一个成员变量shouldRunExtraMethod,该变量在每次测试之前初始化为false,在测试结束时更改为true。在拆卸过程中,只能根据这个变量值来执行

        4
  •  1
  •   Community CDub    7 年前

    如果您的单元测试方法涵盖了您希望抛出异常的场景,请使用 ExpectedException 属性。这里有一篇关于使用这个属性的文章。

    Expect exceptions in nUnit...

        5
  •  0
  •   Kurisu    15 年前

    NUnit assert语句都有一个选项,可以在每个测试失败时为其打印消息。

    虽然如果你想让它在每次测试结束的时候写一些东西,你可以在每个方法的拆卸中设置它。只需将字符串设置为您希望在测试本身中编写的内容,在拆卸过程中(每次测试后都会发生这种情况),它可以对它执行任何您想要的操作。

    我相当肯定,即使抛出异常,也会发生撕裂。你想做什么就做什么。

        6
  •  0
  •   Tim Cooper    13 年前

    问题是NUnit Assert.*方法会在断言失败时抛出一个AssertionException,但它不会执行其他操作。所以看起来你不能检查单元测试之外的任何东西来验证测试是否失败。

    我能想到的唯一选择是使用AOP(面向方面的编程)和诸如 PostSharp . 此工具允许您创建可对特定事件执行操作的方面。例如:

    public class ExceptionDialogAttribute : OnExceptionAspect
    {
      public override void OnException(MethodExecutionEventArgs eventArgs)
      {
        string message = eventArgs.Exception.Message;
        Window window = Window.GetWindow((DependencyObject) eventArgs.Instance);
        MessageBox.Show(window, message, "Exception");
        eventArgs.FlowBehavior = FlowBehavior.Continue;
      }
    }
    

    此方面是每当引发异常时运行的代码:

    [ExceptionDialog]
    [Test]
    public void Test()
    {
        assert.AreEqual(2, 4);
    }
    

    由于上述测试将引发异常,因此ExceptionDialogAttribute中的代码将运行。您可以获取有关该方法的信息,例如它的名称,以便将其登录到文件中。

    我已经很久没有使用PostSharp了,所以值得看看这些例子并进行实验。