unit-testing - 当点击的小部件启动计时器时,如何运行单元测试?

标签 unit-testing flutter

我有一个 Widget,当点击它时,它会保存一个 ID 号,覆盖一个 CircularProgressIndicator 1000 毫秒,然后弹出进度指示器并将用户路由到另一个页面。

ProgressIndicator 和 Timer 的这一点是新的,它破坏了我的单元测试,现在给我以下错误:

The following assertion was thrown running a test:
'package:flutter_test/src/binding.dart': Failed assertion: line 574 pos 12: '() {
      'A Timer is still pending even after the widget tree was disposed.';
      return _fakeAsync.nonPeriodicTimerCount == 0;
    }': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new

When the exception was thrown, this was the stack:
#2      AutomatedTestWidgetsFlutterBinding._verifyInvariants (package:flutter_test/src/binding.dart:574:12)
#3      TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:415:7)
<asynchronous suspension>
#7      TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:392:14)
#8      AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:549:24)
#14     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:547:16)
#15     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:54:50)
#16     Declarer.test.<anonymous closure>.<anonymous closure> (package:test/src/backend/declarer.dart:131:19)
<asynchronous suspension>
#17     Invoker.waitForOutstandingCallbacks.<anonymous closure>.<anonymous closure> (package:test/src/backend/invoker.dart:200:17)
<asynchronous suspension>
#22     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test/src/backend/invoker.dart:197:7)
#26     Invoker.waitForOutstandingCallbacks (package:test/src/backend/invoker.dart:196:5)
#27     Declarer.test.<anonymous closure> (package:test/src/backend/declarer.dart:129:29)
<asynchronous suspension>
#28     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test/src/backend/invoker.dart:322:23)
<asynchronous suspension>
#43     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:385)
#44     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:414)
#45     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
(elided 31 frames from class _AssertionError, class _FakeAsync, package dart:async, package
dart:async-patch, and package stack_trace)

这是失败的测试的样子:

testWidgets('Tapping item saves its id', (WidgetTester tester) async {
  await launchApp(item, tester);
  await tester.tap(find.byConfig(item));

  expect(sameId(global_state.currentId, item.id), isTrue);
});

有没有办法在处理小部件树之前引入延迟?我的其他选择是什么?还是我对问题的根本原因有误?

最佳答案

testWidgets 会自动引入一个 FakeAsync 区域,让您可以穿越时间。使用 pump 来推进时间。

不过,您看到的错误是因为您的小部件在处理时没有取消计时器。确保您的 Widget 对象从不分配资源(如计时器),并且您的 State 对象始终在其 dispose 方法中清理它们分配的任何资源。

关于unit-testing - 当点击的小部件启动计时器时,如何运行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448410/

相关文章:

android - Flutter、Firebase Crashlytics :/com_crashlytics_build_id. xml:资源和 Assets 合并:重复资源

android - 在存储库容器上找不到参数 [] 的方法 google()。 ( flutter )

Flutter:如何跳转到在 PageView 上动态创建的最后一页

flutter - 从 parent 那里再次运行 future

firebase - Firebase_auth 中未定义的类 'UserUpdateInfo'(Flutter 2020)

javascript - 如何测试 Promise.all() 上的 catch block ?

php - 在 firefox 中使用 selenium 插件时,我们如何放置时间戳等动态输入?

unit-testing - 如果满足功能测试,单元测试还重要吗?

java - grails 单元测试域对象列表函数

android - 具有Android注释的Robolectric