AssertFailedException在单元测试中有什么特殊处理吗?

时间:2016-06-18 21:08:29

标签: c# visual-studio unit-testing exception

我想知道AssertFailedException是否有什么特别之处?

是否需要为失败的单元测试抛出或者是否可以抛出任何异常?

如果我抛出任何其他异常,或者测试引擎会以任何不同的方式运行,那会不会有效吗?

我的意思是,AssertFailedException处理的方式与其他例外不同吗?

2 个答案:

答案 0 :(得分:4)

好的,答案是肯定的。

我做了一些测试,发现AssertFailedException被区别对待,而且非常邪恶。

AssertFailedException隐藏整个堆栈跟踪和来自内部异常的所有消息,并仅输出它自己的消息。如果我设置了内部异常并不重要。它不会被展示。

这是您看到的痕迹:

  

类型' UnitTestDemo.MyException'的异常被扔了。在   C中的UnitTestDemo.Foo(String bar):[...] \ Validations.cs:第41行at   C中的UnitTestDemo.IsNullOrEmpty():[...] \ ValidationTests.cs:第29行

这就是当您使用内部异常抛出自定义异常时所获得的:

  

测试方法UnitTestDemo.IsNullOrEmptyPasses抛出异常:   UnitTestDemo.ValidationException:类型异常   ' UnitTestDemo.ValidationException'被抛出但没有一个   预期。 ---> UnitTestDemo.ValidationException:' bar'必须为null或   空。

     

在UnitTestDemo.Validation' 1.Throw [TException](Func' 2 getMessage)在C:[...] \ ValidationHelper.cs:第25行at   UnitTestDemo.IsNullOrEmpty(ValidationContext' 1 context,Func' 2   getMessage)在C:[...] \ Validations.cs中:第42行at   UnitTestDemo.ValidationTests。<> c.b__2_0()in   C:[...] \ ValidationTests.cs:第29行   UnitTestDemo.DoesNotThrow(ValidationContext`1 context)in   C:[...] \ Validations.cs:第36行---内部异常堆栈的结束   痕迹---     在C:[...] \ Validations.cs中的UnitTestDemo.DoesNotThrow(ValidationContext' 1上下文):第40行   C中的UnitTestDemo.IsNullOrEmptyPasses():[...] \ ValidationTests.cs:line   29

您不仅可以看到来自测试的消息,还可以看到内部异常和完整的堆栈跟踪。

答案 1 :(得分:2)

我会说这种类型的异常是特殊的,但只是因为它碰巧是遇到以下代码时抛出的异常类型:

Assert.Fail();

不,这绝对不是必需的,但每当我使用MSTest时,只要我需要公然向Test-Explorer表明我的测试失败,这就是我抛出的异常类型。

不,一切都会奏效。但是,请记住,无论何时抛出异常(至少在Visual-Studio的MSTest情况下),您的测试确实会失败。实际上,这是您将如何测试代码可能遇到的一些问题/错误。有时当我的测试失败时,这是因为我的代码抛出异常(并失败),允许我追踪并修复我的错误。

请参阅MSDN处的文档。正如您所看到的,这种类型的异常只是继承了普通的System.Exception,因此不能指望它与任何其他类型的异常有任何不同。