9

刚刚遇到了一些有趣的行为 -AssertCatch阻止。

List<Decimal> consArray = new List<decimal>();
try
{
    Decimal d;
    Assert.IsTrue(Decimal.TryParse(item.Value, out d));
    consArray.Add(d);
}
catch (Exception e)
{
     Console.WriteLine(item.Value);
     Console.WriteLine(e);
}

断言抛出AssertFailedException并被catch. 一直认为如果Assert失败则测试失败并中止连续执行。但在那种情况下 - 测试继续进行。如果以后没有任何问题发生 - 我得到绿色测试!理论上 - 这是正确的行为吗?

编辑:我知道这可能是 .NET 限制以及如何在 MsTest 中进行断言。断言抛出异常。因为catch- 捕获它捕获断言异常的所有内容。但它在理论上是正确的还是特定于 MsTest 的?

4

3 回答 3

6

正如已经回答的那样,这是正确的行为。您可以通过捕获 AssertFailedException 并重新抛出它来更改您的代码以获得您的预期行为。

        List<Decimal> consArray = new List<decimal>();
        try
        {
            Decimal d;
            Assert.IsTrue(Decimal.TryParse(item.Value, out d));
            consArray.Add(d);
        }
        catch (AssertFailedException)
        {
            throw;
        }

        catch (Exception e)
        {
            Console.WriteLine(item.Value);
            Console.WriteLine(e);
        }
于 2013-02-15T09:48:48.950 回答
5

您的代码按预期工作。当Assert失败时,它会抛出一个继承自Exception的AssertFailedException。所以你可以添加一个并抓住它。try-catch

throw在您的情况下,在末尾添加 acatch并重新引发异常。

于 2013-02-15T07:14:52.810 回答
5

NUnit会做同样的事情。与我认为的任何其他测试框架一样,但我只知道MStestNUnit在 C# 中。

我希望您的测试代码不会包含Decimal.TryParse,但您的业务逻辑会这样做,您将使用对象和方法调用对其进行测试。

就像是:

var sut = new Sut();
var d = sut.DoSomethingThatReturnsTheDecimal(item.Value);

Assert.AreEqual(0.123, d, string.Format("passed value can not be parsed to decimal ({0})", item.Value);

为了更接近您的实施:

List<Decimal> consArray = new List<decimal>();

Decimal d = Decimal.MinValue;

// You don't need to try-catch a Decimal.TryParse
// Decimal.TryParse(item.Value, out d));

try
{
    d = Decimal.Parse(item.Value)
}
catch
{
    // Handle exception
}

Assert.AreEqual(0.123, d);

// Does the list add anything at all? In this sample it seems a bit redundant
consArray.Add(d);

无论如何,回答你的问题。try-catch 应该能捕捉到你的AssertFailedException.

PS:接住AsserFailedException再扔也行,不过感觉有点奇怪。我会努力将Asserts 留在任何try-catch街区之外。但这可能只是我的意见,你没有要求:)。

于 2013-02-15T09:27:39.817 回答