我正在尝试在一个测试文件的同一组中运行两个测试。 如果我将它们分成两个单独的测试文件,它们就可以正常工作。 但如果我将它们添加到一个组中,第二个测试就会失败,并显示错误:“TypeAdapter 已为给定 id 注册”。
我的应用程序使用 HiveDB,并在启动应用程序之前在
main.dart
中设置 Hive 框。我知道第二次测试也在尝试相同的操作但失败了,因为设置已经完成。
我按照此文档设置和编写集成测试。
大多数 YouTube 教程、媒体文章和其他在线资源都很好地解释了如何在测试文件中运行单个测试,但它们已经过时了。我还没有找到在同一个文件中有两个测试的资源。
main.dart
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
await HiveDB.setup();
runApp(App());
}
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:integrationtestdemo/main.dart' as app;
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('Home screen tests', () {
tearDown(() async {
print("TearDown() -- called");
await HiveDB.close();
});
testWidgets('Scenario # - loreum ipsum ...', (tester) async {
// ARRANGE
await app.main();
await tester.pumpAndSettle();
// ACT
// ASSERT
expect(1 + 3, 4);
});
testWidgets('Scenario #2', (tester) async {
// ARRANGE
await app.main();
await tester.pumpAndSettle();
// ACT
// ASSERT
expect(2 + 2, 4);
});
});
}
flutter drive --driver=.\test_driver\integration_test.dart --target=.\test\app_test.dart
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞═════════════════
The following HiveError was thrown running a test:
There is already a TypeAdapter for typeId 1.
When the exception was thrown, this was the stack:
#0 TypeRegistryImpl.registerAdapter (package:hive/src/registry/type_registry_impl.dart:104:11)
#1 HiveDB.setup (package:occasionly/src/services/hive_db.dart:80:10)
<asynchronous suspension>
有人可以帮我吗?我被困在这个问题上很长一段时间,无法找到一种方法来隔离测试之间的状态?
我发现了一个肮脏的技巧来解决“TypeAdapter 已为给定的 id 注册”这个错误
尝试这样写,就不会再出现错误了
Hive.registerAdapter(YourAdapter(), override: true);
但我不知道这个论点可能会产生什么影响
我也遇到了同样的问题,但是我参考这个 ERROR in flutter: widget_test.dart Cannot detector MyApp() 找到了解决方法,你可以尝试一下。
testWidgets('Scenario #1', (tester) async {
// ARRANGE
await app.main();
...
});
testWidgets('Scenario #2', (tester) async {
// ARRANGE
await tester.pumpWidget(MyApp());
});
我正在分享对我有用的解决方案......
void main(
setUpAll(() async {
// Initialize Hive and clear boxes
await Hive.initFlutter();
await Hive.deleteFromDisk();
});
testWidgets('Scenario #1', (tester) async {
// ARRANGE
await app.main();
...
});
testWidgets('Scenario #2', (tester) async {
// ARRANGE
await tester.pumpWidget(MyApp());
});
)