在Nunit或MsTest中断言失败时如何捕获异常

时间:2019-05-20 19:47:17

标签: nunit mstest

使用NUnit ir MeTest声明方法时如何捕获失败的声明异常消息或状态。

当我的断言失败时,我试图捕获“ AssertionException”,如何使用NUnit或MsTest捕获它。因为Assert方法不返回任何类型。我的要求是,即使断言获取未能完成剩余的断言,测试也应继续进行,应该捕获错误并使此断言失败。我正在使用下面的代码语句。当我使用Nunit框架时,即使我使用try .. catch块,它的失败和连续到下一个断言的购买也无法捕获,而在MsTest中,它失败了,使用try..catch块进行捕获,而不继续到下一个断言。 非常感谢您的帮助!

    public static void ResponseValueAssert(dynamic actualValue, dynamic expectedValue, string nameOfAssert)
    {
        //var ex = Assert.Throws<AssertionException>(() =>
        //Assert.AreEqual(expectedValue, actualValue, "Actual value doesn't match with Expected value {0}", nameOfAssert));

        if (ResponseValueAssertImplicit(actualValue, expectedValue, nameOfAssert))
        {
            Console.WriteLine("\r\nResponse Assert:- {0}: <PASS>", nameOfAssert);
        }
        else
        {
            Console.WriteLine("\r\nResponse Assert:- {0}: <<FAIL>>", nameOfAssert);

            Console.Error.WriteLine("\r\nResponse Assert:- {0}: <<FAIL>>", nameOfAssert);

            // Assert.Fail();
        }

        Console.WriteLine("Expected Value: {0}.\r\nActual Value: {1}.", actualValue, expectedValue);
    }

    public static bool ResponseValueAssertImplicit(dynamic actualValue, dynamic expectedValue, string nameOfAssert)
    {
        try
        {
            Assert.AreEqual(expectedValue, actualValue, "Actual value doesn't match with Expected value {0}", nameOfAssert);
            return true;
        }
        catch (AssertionException ex)
        {
            return false; 
        }
    }

1 个答案:

答案 0 :(得分:1)

将两个完全不同的软件作为一个问题问是没有用的。对于NUnit和MSTest来说,答案显然是不同的,这些天实现起来已经完全不同了。

所以我只回答关于NUnit的问题,因为我不知道您将如何使用MSTest。

在NUnit中,如果希望测试继续进行,以便可以在同一测试中报告多个断言,则可以使用多个断言。那是...

Assert.Multiple(() =>
{
    // Put your various asserts here
};

NUnit将报告所有失败的断言。在该块的末尾,如果任何断言失败,则测试将终止。

请注意,许多人会说测试中有多个断言是一个坏主意。我相信大多数时候都是这样,但是在某些情况下(例如检查同一对象的多个属性)会很有用。

同样,为了记录,您应该从不捕获正在由测试框架内部使用的异常。它们基本上是隐藏的实现细节,在下一版软件中您的所有工作都可能会丢失……在这种情况下,某些人已经发生了这种情况。