我想知道AssertFailedException
是否有什么特别之处?
是否需要为失败的单元测试抛出或者是否可以抛出任何异常?
如果我抛出任何其他异常,或者测试引擎会以任何不同的方式运行,那会不会有效吗?
我的意思是,AssertFailedException
处理的方式与其他例外不同吗?
答案 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
,因此不能指望它与任何其他类型的异常有任何不同。