如何在 Dart 中捕获完整堆栈

问题描述

我做了一个最小可重复的例子来说明我的问题:

感谢 Gunthers 的回答 How to get the full stack trace for async execution,我能够打印完整的跟踪记录,包括调用到测试根的每个函数

email.css

使用此代码,它意味着 import 'package:Flutter/material.dart'; import 'package:Flutter_test/Flutter_test.dart'; import 'package:stack_trace/stack_trace.dart'; late WidgetTester tester; void expectFoo() { expect(find.text('Foos'),findsOneWidget); } Future<void> build() async { await tester.pumpWidget(Column( children: [ CircularProgressIndicator(),Text('Foo',textDirection: TextDirection.ltr),],)); await tester.pumpAndSettle(); // <- This fails the test expectFoo(); // <- This also fails the test but comment above line first } Future<void> setup() async { await build(); } Future<void> testIfFooIsThere() async { await setup(); } void main() { testWidgets('Stack trace',(WidgetTester _tester) async { tester = _tester; await Chain.capture(() async { await testIfFooIsThere(); },onError: (e,stack) { print(e); print("Chain ${Trace.from(stack).terse}"); throw e; }); }); } 处的测试失败。这是跟踪:

pumpAndSettle()

从上面的跟踪可以看出,我得到了堆栈跟踪中的每个函数,直到 ══╡ EXCEPTION CAUGHT BY FlutteR TEST FRAMEWORK ╞════════════════════════════════════════════════════ The following assertion was thrown running a test: pumpAndSettle timed out When the exception was thrown,this was the stack: #1 WidgetTester.pumpAndSettle.<anonymous closure> (package:Flutter_test/src/widget_tester.dart:651:11) #3 TestAsyncUtils.guard.completionHandler (package:Flutter_test/src/test_async_utils.dart:111:16) #17 WidgetTester.pumpAndSettle.<anonymous closure> (package:Flutter_test/src/widget_tester.dart:0:0) #21 TestAsyncUtils.guard (package:Flutter_test/src/test_async_utils.dart:114:19) #22 WidgetTester.pumpAndSettle (package:Flutter_test/src/widget_tester.dart:646:27) #23 build (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:17:16) #26 setup (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:22:9) #27 testIfFooIsThere (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:26:9) #28 main.<anonymous closure>.<anonymous closure> (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:33:13) #29 main.<anonymous closure>.<anonymous closure> (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:32:25) #36 main.<anonymous closure> (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:32:17) #37 main.<anonymous closure> (file:///Users/samran/AndroidStudioProjects/flit_ride/test/widget_test_stack.dart:30:30) #38 testWidgets.<anonymous closure>.<anonymous closure> (package:Flutter_test/src/widget_tester.dart:156:29) (elided 25 frames from dart:async,dart:async-patch,and package:stack_trace) The test description was: Stack trace

所以现在当我评论这行 testWidgets > testIfFooIsThere > setup > build 时, 我希望在 await tester.pumpAndSettle(); // <- This fails the test

处收到断言错误

但堆栈跟踪仅包括 expect(find.text('Foos'),findsOneWidget);build

expectFoo

为什么??

我应该怎么做才能使第二个错误跟踪表现得像第一个

最终,我的目标是在测试期间发生错误时,打印每个函数及其行号,从 testWidgets 到出错的行。欢迎使用替代解决方

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)