0

当标有“异步”的测试用例失败时,就会出现问题。在这种情况下,应用程序只是崩溃,出现未处理的 TargetInvocationFail 异常。据我了解,测试应用程序应该处理这些异常,因为如果出现异常,它应该将相应的情况标记为失败。这正是正常测试用例所发生的情况(其中没有 async / await 的东西)。

我也为此创建了一个问题报告,请参阅http://phone.codeplex.com/workitem/10751。如果您有同样的问题,请点赞该问题。如果您碰巧知道一些解决方法,请在这里告诉我。

编辑:正如斯蒂芬克利里在评论中提到的那样,这个问题是由于我的测试用例过程是异步无效的,而不是异步任务造成的。然后我将这个问题重新表述如下:为什么改变测试用例的返回类型会改变异常处理的行为?

4

2 回答 2

3

一个好的一般准则是“避免async void”。造成这种情况的一个原因是异常处理的差异:async Task方法会将任何异常放在其返回的 上Task,这可以在 ed 时观察Taskawait。方法将直接在方法启动时的当前事件async void上引发异常。SynchronizationContextasync void

要记住的另一件事是,这async主要是编译器转换。如果您(或其他任何人)async Task在运行时反映了一个方法,您只会看到一个返回类型为Task;的方法。类似地,一个async void方法只有一个返回类型void

因此,当测试运行程序看到一个方法返回void(不知道它是一个async void方法)时,它会执行它并看到它返回而没有(直接)引发异常,因此它将其标记为“通过”。同时,该async void方法抛出的异常直接在SynchronizationContext(包括 MSTest 在内的大多数测试运行程序提供线程池SynchronizationContext)上引发,并且此异常可能导致测试运行报告非特定错误 - 或者可能会被忽略,如果测试运行足够快地完成。

现代测试运行器(包括 VS2012 的 MSTest)async Task通过检测 的返回类型来理解方法,并且在考虑测试方法“完成”并将其标记为通过(或失败,如果返回包含异常)之前Task将等待完成.TaskTask

在我的博客上的 MSTest 中有这种行为的示例(包括显示竞争条件的两个输出的屏幕截图),但请注意,这些博客条目已有将近一年的历史,并且谈论async使用 VS2010 进行单元测试。MSTest 已使用 VS2012 进行了更新,因此它具有合理的async Task方法行为。

于 2013-01-18T15:14:58.953 回答
0

我们遇到的 SL/WP 工具包崩溃的主要问题是由于在测试失败后断言或调用 TestComplete 或调用 TestComplete 两次引起的。示例:假设您使用超时属性标记了一个测试,并且您正在等待一个比超时时间更长的网络请求。如果 webrequest 没有失败,只是速度很慢,它仍然会在单元测试框架认为完成后返回并调用 TestComplete()。我不知道如何测试测试是否超时,所以我可以编写测试来防止这种情况发生,所以我建议不要在其中一些场景中使用它。

另一种情况是您等待两个事件,例如“完成”和“失败”事件,如果其中任何一个被引发,您会做不同的事情,但它们都调用 TestComplete:假设您的代码意外引发了两个事件 = > 你刚刚调用了测试完成并且你的代码失败了。第三种情况是您有一个共享对象,假设您没有在每个测试中重新创建一个 WebClient 实例:现在第一个测试侦听 DownloadString 并执行此操作。下一个测试在运行时也会开始侦听 DownloadString,但由于旧的没有从中解脱,它的 DownloadStringCompleted 事件处理程序将再次运行,导致单元测试崩溃。

正如斯蒂芬所提到的,您不能在 SL 和 WP 单元测试框架中返回 Task 。我已经设法将其破解到 Silverlight 单元测试运行程序中,您可以在此处阅读:http: //www.sharpgis.net/post/2012/12/21/Hacking-the-Silverlight-Unit-Tests-to -support-returning-Task.aspx 我也很乐意为 Windows Phone 单元测试这样做,但它的源代码不可用,但请在此处投票支持此版本的发布:http://phone .codeplex.com/workitem/10642

还请投票支持在此处向单元测试框架添加对 Task 的支持: http ://phone.codeplex.com/workitem/10727(WinPhone)和此处: http ://silverlight.codeplex.com/workitem/11457 (Silverlight)

于 2013-01-18T15:47:14.953 回答