捕获NUnit AssertionException而不会在C#

时间:2017-02-15 17:19:48

标签: c# nunit-3.0

所以这是一个奇怪的设置。我正在将测试从MSTest(Visual Studio单元测试)转移到NUnit 3 +。

在我原来的测试框架中,我添加了一个名为Verify的测试实用程序,其中进行了断言,但是异常被抑制/忽略,我们只是等到测试结束时断言是否发生了任何故障。

public class Verify {
    public static int NumExceptions = 0;

    public static void AreEqual(int expected, int actual) {
        try {
            Assert.AreEqual(expected, actual);
        } catch (AssertFailedException) {
           NumExceptions++;
        }
    }

    public static void AssertNoFailures() {
        Assert.AreEqual(0, _numExceptions);
    }
}

因此,测试代码可能是:

[TestMethod]
public void VerifyPassesCorrectly() {
    int x = 2;
    int y = 3;

    Verify.AreEqual(3, y);
    Verify.AreEqual(2, x);
    Verify.AreEqual(5, x + y);

    Verify.AssertNoFailures();
}

[TestMethod]
[ExpectedException(typeof(AssertFailedException))]
public void VerifyCountsFailuresCorrectly() {
    Verify.AreEqual(3, 2);
    Assert.AreEqual(1, Verify.NumExceptions);
}

即使抛出了AssertFailedException,这两个测试都会通过

当我转向NUnit时,似乎有更好的方法可以解决这个问题(Warn,MultipleAssert)。最终,我们将构建新的测试以利用这些改进。但是,与此同时,我需要为现有测试提供一些向后兼容性。

我最初的计划是简单地换出库并更改异常类型:

public static void AreEqual(int expected, int actual) {
    try {
        Assert.AreEqual(expected, actual);
    } catch (AssertionException) {
       NumExceptions++;
    }
}

这不需要对现有测试代码进行实质性更改,也不需要对Verify类的结构进行实质性更改。但是,当我在Visual Studio中使用NUnit Adapter执行此类测试时,第二个测试按预期运行(不会出现异常),但仍然无法通过测试,列出了在验证步骤中找到的异常。 / p>

更广泛的解决方案是简单地删除Verify类,因为NUnit不再需要它。但是在这种情况发生之前,有没有办法在Verify中使用NUnit API,以便验证类中的断言不会存储"通过NUnit,以前用于测试失败?

1 个答案:

答案 0 :(得分:2)

你将无法告诉NUnit,Asserts应该以某种方式不会使测试失败。所以,你可以做的就是改变你的AreEqual方法,让你自己做同等性测试。

$(function() {
  $('input:radio').on('click', function() {
    var name = $(this).attr("name");
    if($('input[name="'+name+'"]:eq(1)')[0].checked){
      $('label[name="'+name+'"]').addClass('arrowup');
    }
    else
    {
      $('label[name="'+name+'"]').removeClass('arrowup');
    }
});
});

这似乎是最简单的解决方案。

第二个选项是完全按照NUnit在其Assert语句中执行的操作。如果你想(但当然没有导致测试失败)。代码如下所示:

if (expected != actual) {
  NumExceptions++;
}

public static void AreEqual(int expected, int actual) { var equalToConstraint = Is.EqualTo(expected); var result = equalToConstraint.ApplyTo(actual); if (!result.IsSuccess) { NumExceptions++; } } 类是NUnit的一部分,但它是公共的,如果你愿意,可以像这样使用它。