Flutter:在小部件测试中测试异常

Posted

技术标签:

【中文标题】Flutter:在小部件测试中测试异常【英文标题】:Flutter: Testing for exceptions in widget tests 【发布时间】:2019-06-13 04:38:50 【问题描述】:

在 Flutter 中进行小部件测试期间,如何确保 ui(小部件)抛出异常。这是我的代码不起作用:

expect(
  () => tester.tap(find.byIcon(Icons.send)),
  throwsA(const TypeMatcher<UnrecognizedTermException>()),
);

失败并出现以下错误

...
Expected: throws <Instance of 'TypeMatcher<UnrecognizedTermException>'>
  Actual: <Closure: () => Future<void>>
   Which: returned a Future that emitted <null>

或者......我是否应该通过查找错误消息等来测试 UI 如何处理异常?

【问题讨论】:

【参考方案1】:

要捕获颤振测试中抛出的异常,请使用WidgetTester.takeException。这将返回框架捕获的最后一个异常。

await tester.tap(find.byIcon(Icons.send));
expect(tester.takeException(), isInstanceOf<UnrecognizedTermException>());

您也不需要throwsA 匹配器,因为它不会从方法中抛出。

【讨论】:

实际上expect(tester.takeException(), isInstanceOf&lt;UnrecognizedTermException&gt;()); 工作得很好!谢谢 你让我想到:“...返回框架捕获的最后一个异常”。我宁愿让我的逻辑抓住它以获得更好的设计。这还是很有价值的。不接受 4 分钟后的答案 请注意,这并不适用于所有情况。在极少数情况下,您可能需要覆盖 FlutterError.onError(并在之后恢复)。 该死!。我刚刚遇到了 FlutterError.onError 问题。将发布另一个问题 嘿,在异步上下文中引发的异常呢?我无法在测试中捕捉到它们。

以上是关于Flutter:在小部件测试中测试异常的主要内容,如果未能解决你的问题,请参考以下文章

在小部件测试中处理提供程序

如何在小部件测试中找到屏幕外的 ListView 子项?

如何在 Flutter 小部件测试中执行缩放(捏缩放)多指手势?

如何在小部件测试期间存根不属于类的函数?

如何在小部件测试中测试特定的 ProviderNotFoundException

Flutter - 动态小部件定位