如何在颤振测试中初始化 ScreenUtil.init()?

Posted

技术标签:

【中文标题】如何在颤振测试中初始化 ScreenUtil.init()?【英文标题】:How to initialize ScreenUtil.init() in flutter test? 【发布时间】:2021-06-21 04:10:09 【问题描述】:

对于在颤振中创建的 BMI 应用程序,我正在编写一个测试,所以当我运行测试时,我收到以下错误:

═╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═
The following assertion was thrown building home_screen(dirty, state: _home_screenState#60944):

Ensure to initialize ScreenUtil before accessing it.
Please execute the init method : ScreenUtil.init()
'package:flutter_screenutil/screen_util.dart':
Failed assertion: line 32 pos 7: '_instance != null'

The relevant error-causing widget was:
  home_screen file:///C:/Users/bmi/test/test.dart:14:32

When the exception was thrown, this was the stack:
#2      new ScreenUtil (package:flutter_screenutil/screen_util.dart:32:7)
#3      _home_screenState.build (package:bmi/ui_screen/HomeScreen.dart:54:22)
#4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4612:27)
#5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4495:15)
#6      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4667:11)
#7      Element.rebuild (package:flutter/src/widgets/framework.dart:4189:5)
#8      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4474:5)
#9      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4658:11)
#10     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4469:5)
#11     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3541:14)
#12     Element.updateChild (package:flutter/src/widgets/framework.dart:3303:20)
#13     RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1182:16)
#14     RenderObjectToWidgetElement.update (package:flutter/src/widgets/binding.dart:1160:5)
#15     RenderObjectToWidgetElement.performRebuild (package:flutter/src/widgets/binding.dart:1174:7)
#16     Element.rebuild (package:flutter/src/widgets/framework.dart:4189:5)
#17     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2694:33)
#18     AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1102:19)
#19     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:319:5)
#20     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
#21     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
#22     AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:969:9)
#25     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#26     AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:956:27)
#27     WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:522:22)
#30     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#31     WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:519:27)
#32     main.<anonymous closure> (file:///C:/Users/bmi/test/test.dart:14:21)
#33     main.<anonymous closure> (file:///C:/Users/bmi/test/test.dart:12:32)
#34     testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:144:29)
<asynchronous suspension>
<asynchronous suspension>
(elided 7 frames from class _AssertionError, dart:async, and package:stack_trace)
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞══
The following TestFailure object was thrown running a test:
  Expected: exactly 2 matching nodes in the widget tree
  Actual: _WidgetTypeFinder:<zero widgets with type "GestureDetector" (ignoring offstage widgets)>
   Which: means none were found but some were expected

When the exception was thrown, this was the stack:
#4      main.<anonymous closure> (file:///C:/Users/bmi/test/test.dart:17:5)
<asynchronous suspension>
<asynchronous suspension>
(elided one frame from package:stack_trace)
...
This was caught by the test expectation on the following line:
  file:///C:/Users/bmi/test/test.dart line 17
The test description was:
  age increment
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞══
The following message was thrown:
Multiple exceptions (2) were detected during the running of the current test, and at least one was
unexpected.
Test failed. See exception logs above.
The test description was: age increment

这是我的颤振测试代码:

import 'package:bmi_app_one/ui_screen/HomeScreen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main()
  TestWidgetsFlutterBinding.ensureInitialized();
  testWidgets('age increment', (WidgetTester ageTester) async 

    await ageTester.pumpWidget(home_screen());

    // To verify that age counter starts at 20
    expect(find.byType(GestureDetector), findsNWidgets(2));
    expect(find.text('0'), findsNothing);
  );

我尝试像这样初始化它,但得到了同样的错误:

 setUpAll(() async
     TestWidgetsFlutterBinding.ensureInitialized();
     await ScreenUtilInit();
   );

尝试谷歌搜索,但在颤振测试中找不到如何初始化 ScreenUtil()。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我所做的就是用 ScreenUtilInit 包裹你的主屏幕:

 await tester.pumpWidget(
      MaterialApp(
          home: ScreenUtilInit(
        designSize: Size(360, 690),
        allowFontScaling: false,
        child: home_screen(),
      )),
    );

【讨论】:

以上是关于如何在颤振测试中初始化 ScreenUtil.init()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤振飞镖中使用相同的元素初始化列表?

如何在颤振小部件测试中发出 http 请求?

如何在颤振集成测试中模拟 http 请求?

如何在颤振测试覆盖率中排除文件?

如何在颤振小部件测试中捕获来自未来的错误?

如何在浏览器中运行颤振单元测试?