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

时间:2009-07-27 17:11:32

标签: unit-testing nunit

在我的公司,我们正在编写一系列单元测试。我们想要做的是执行单元测试,每当测试结束时成功或失败时,我们都可以在某处编写,但我们不想在每次测试中都使用该逻辑。

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

6 个答案:

答案 0 :(得分:3)

我猜你做的是这样的事情:

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

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

[Test]
public void FailBecauseOfException()
{
   throw new Exception();
}

答案 1 :(得分:2)

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

如果你希望在测试通过的情况下运行某些东西,你可以有一个成员变量shouldRunExtraMethod,它在每次测试之前初始化为false,并在测试结束时更改为true。在TearDown上,您只能根据此变量值执行它

答案 2 :(得分:2)

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

如果你有 按照你说的方式记录它的原因,那么你要么必须将自定义代码添加到每个测试中,要么拥有一个共同的“跑步者”您的代码(对于每个测试)作为匿名方法并在单个try..catch中运行它。这样可以防止你不得不为每次测试重复try..catch。

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

答案 3 :(得分:1)

如果您的单元测试方法涵盖了您希望抛出异常的方案,请使用ExpectedException属性。这里有关于使用该属性的帖子。

Expect exceptions in nUnit...

答案 4 :(得分:0)

NUnit断言语句都可以选择为每个测试失败时打印一条消息。

虽然如果您希望在每次测试结束时在某处写出某些内容,您可以在每种方法的拆解中进行设置。只需将字符串设置为您想要在测试内部写入的内容,并在拆解期间(在每次测试后发生)它可以随心所欲地执行任何操作。

即使抛出异常,我也相当确定会发生拆解。那应该做你想要的。

答案 5 :(得分:0)

你遇到的问题是,只要一个断言失败,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以来已经很长时间了,所以值得查看示例并进行实验。