2017-02-24 1 views
1

私は、クリックするとID番号を保存し、CircularProgressIndicatorを1000msオーバレイしてから進行状況インジケータをポップアップし、別のページにルーティングするウィジェットを持っています。 ProgressIndicatorとタイマー付きタップウィジェットがタイマーを起動したときにユニットテストを実行するにはどうすればよいですか?

このビットは新しく、今私に次のエラーを与える私のユニットテストを、壊れている:

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); 
}); 

ウィジェットツリーを削除する前に遅延を導入する方法はありますか?私の他の選択肢は何ですか?あるいは、私は問題の根本的な原因について間違っていますか?

答えて

2

testWidgetsは、自動的にFakeAsyncゾーンが導入され、時間を踏み越えることができます。時間を進めるにはpumpを使用してください。

しかし、表示されているエラーは、あなたのウィジェットが処分されたときにタイマーをキャンセルしていないためです。あなたのウィジェットオブジェクトはリソース(タイマーのような)を決して割り当てないようにしてください。あなたのStateオブジェクトは、disposeメソッドで割り当てたリソースを常にクリーンアップしてください。

関連する問題