Flutter 单元测试 - 绑定尚未初始化

Ana*_*har 2 unit-testing dart dart-unittest hybrid-mobile-app flutter

在单元测试中使用 SharedPreference 抛出错误。在一个函数中,我使用了 SharedPreference,在它的单元测试过程中,出现“绑定尚未初始化”错误以及许多其他错误。

\n

工作单元测试:\n在此输入图像描述

\n

取消注释 SharedPreference 代码后:\n在此输入图像描述

\n

下面是我的 User.dart 文件的代码

\n

\r\n
\r\n
import \'package:shared_preferences/shared_preferences.dart\';\n\nclass User {\n  final String name;\n\n  User(this.name);\n  Future<bool> userName() async {\n    SharedPreferences prefs = await SharedPreferences.getInstance();\n    await prefs.setString("name", name);\n    return true;\n  }\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

下面是测试文件的代码(User_test.dart)

\n

\r\n
\r\n
import \'dart:math\';\n\nimport \'package:flutter_test/flutter_test.dart\';\nimport \'package:unit_testf/user.dart\';\n\nvoid main() {\n  test("a unit test", () async {\n    User user = User("flutter");\n    final result = await user.userName();\n    expect(result, true);\n  });\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

以下是我收到的错误。

\n

\r\n
\r\n
Binding has not yet been initialized.\nThe "instance" getter on the ServicesBinding binding mixin is only available once that binding has been initialized.\nTypically, this is done by calling "WidgetsFlutterBinding.ensureInitialized()" or "runApp()" (the latter calls the former). Typically this call is done in the "void main()" method. The "ensureInitialized" method is idempotent; calling it multiple times is not harmful. After calling that method, the "instance" getter will return the binding.\nIn a test, one can call "TestWidgetsFlutterBinding.ensureInitialized()" as the first line in the test\'s "main()" method to initialize the binding.\nIf ServicesBinding is a custom binding mixin, there must also be a custom binding class, like WidgetsFlutterBinding, but that mixes in the selected binding, and that is the class that must be constructed before using the "instance" getter.\npackage:flutter/src/foundation/binding.dart 284:9                               BindingBase.checkInstance.<fn>\npackage:flutter/src/foundation/binding.dart 366:6                               BindingBase.checkInstance\npackage:flutter/src/services/binding.dart 54:54                                 ServicesBinding.instance\npackage:flutter/src/services/platform_channel.dart 166:45                       BasicMessageChannel.binaryMessenger\npackage:flutter/src/services/platform_channel.dart 180:38                       BasicMessageChannel.send\npackage:shared_preferences_foundation/messages.g.dart 115:52                    UserDefaultsApi.getAll\npackage:shared_preferences_foundation/shared_preferences_foundation.dart 46:53  SharedPreferencesFoundation.getAll\npackage:shared_preferences/shared_preferences.dart 164:57                       SharedPreferences._getSharedPreferencesMap\npackage:shared_preferences/shared_preferences.dart 33:19                        SharedPreferences.getInstance\npackage:unit_testf/user.dart 8:55                                               User.userName\ntest/user_test.dart 9:31                                                        main.<fn>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

以下是我的 flutter doctor 命令的输出

\n

\r\n
\r\n
Last login: Thu Feb 16 09:58:26 on console\nanandsuthar@anands-MacBook-Air ~ % flutter doctor\nDoctor summary (to see all details, run flutter doctor -v):\n[\xe2\x9c\x93] Flutter (Channel stable, 3.3.10, on macOS 13.1 22C65 darwin-x64, locale en-GB)\n[\xe2\x9c\x93] Android toolchain - develop for Android devices (Android SDK version 33.0.1)\n[\xe2\x9c\x93] Xcode - develop for iOS and macOS (Xcode 14.2)\n[\xe2\x9c\x93] Chrome - develop for the web\n[\xe2\x9c\x93] Android Studio (version 2022.1)\n[\xe2\x9c\x93] VS Code (version 1.75.1)\n[\xe2\x9c\x93] Connected device (2 available)\n[\xe2\x9c\x93] HTTP Host Availability\n\n\xe2\x80\xa2 No issues found!\nanandsuthar@anands-MacBook-Air ~ % 
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

G3n*_*caj 6

根据您正在运行的上下文,您必须确保它ServicesBinding已被初始化。

\n

Widget制作以显示 an作为第一件事开始的东西很容易调用ServicesBinding 已初始化的其余部分。\n但是调用必须初始化的方法/类,您必须通过调用显式调用初始化的这两个方法来确保已初始化。

\n
TestWidgetsFlutterBinding.ensureInitialized();\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
WidgetsFlutterBinding.ensureInitialized();\n
Run Code Online (Sandbox Code Playgroud)\n

所以你的主要方法必须是:

\n
void main() async {\n  // First call\n  WidgetsFlutterBinding.ensureInitialized();\n\n  // Then Your code after\n  //\xe2\x80\xa6\xe2\x80\xa6\n  //\xe2\x80\xa6\xe2\x80\xa6\n  //\xe2\x80\xa6...\n}\n
Run Code Online (Sandbox Code Playgroud)\n