使用 GetIt 时并行单元测试 运行
Unit tests running in parallel in flutter when using GetIt
我正在编写一个 flutter 应用程序,我正在使用 GetIt 进行依赖注入。
当我编写单元测试时,我会这样做:
void main() {
group("tests", () {
test("test1", () {
GetIt.I.reset();
GetIt.I.registerSingleton(MyDependency());
// Some code using GetIt.I<MyDependency>()
});
test("test2", () {
GetIt.I.reset();
GetIt.I.registerSingleton(MyDependency());
// Some code using GetIt.I<MyDependency>()
});
});
}
当我 运行 一个接一个地测试时,它完美地工作。
当我 运行 一次全部测试时,我在行 GetIt.I<MyDependency>()...
上得到这样的错误:
'package:get_it/get_it_impl.dart': Failed assertion: line 372 pos 7: 'instanceFactory != null': Object/factory with type HttpActions is not registered inside GetIt.
所以我的猜测是,并行测试 运行 和一个测试的设置 GetIt.I.reset()
与另一个测试的设置冲突。
那我该如何解决呢?
- 我能以某种方式告诉测试,它们不能 运行 并行吗?
- 或者在这种情况下是否有安全使用
GetIt
的方法?
我认为您的问题与 运行 您的并行测试无关,而是与 GetIt.I.reset()
是异步方法这一事实有关:
实施
Future<void> reset({bool dispose = true});
并且如 documentation of the package 中针对此方法所述:
[...] As dispose functions can be async, you should await this function.
代码示例
我根据您提供的代码并受到 unit tests written for the package 的启发制作了一个新的测试示例,它似乎工作正常。
import 'package:flutter_test/flutter_test.dart';
import 'package:get_it/get_it.dart';
import 'package:so_tests/my_dependency.dart';
void main() {
// This method provided by `flutter_test` is called before each test.
setUp(() async {
// Make sure the instance is cleared before each test.
await GetIt.I.reset();
});
group('tests', () {
test('test1', () {
final getIt = GetIt.instance;
getIt.registerSingleton(MyDependency());
// Some code using getIt<MyDependency>()
});
test('test2', () {
final getIt = GetIt.instance;
getIt.registerSingleton(MyDependency());
// Some code using getIt<MyDependency>()
});
});
}
我正在编写一个 flutter 应用程序,我正在使用 GetIt 进行依赖注入。
当我编写单元测试时,我会这样做:
void main() {
group("tests", () {
test("test1", () {
GetIt.I.reset();
GetIt.I.registerSingleton(MyDependency());
// Some code using GetIt.I<MyDependency>()
});
test("test2", () {
GetIt.I.reset();
GetIt.I.registerSingleton(MyDependency());
// Some code using GetIt.I<MyDependency>()
});
});
}
当我 运行 一个接一个地测试时,它完美地工作。
当我 运行 一次全部测试时,我在行 GetIt.I<MyDependency>()...
上得到这样的错误:
'package:get_it/get_it_impl.dart': Failed assertion: line 372 pos 7: 'instanceFactory != null': Object/factory with type HttpActions is not registered inside GetIt.
所以我的猜测是,并行测试 运行 和一个测试的设置 GetIt.I.reset()
与另一个测试的设置冲突。
那我该如何解决呢?
- 我能以某种方式告诉测试,它们不能 运行 并行吗?
- 或者在这种情况下是否有安全使用
GetIt
的方法?
我认为您的问题与 运行 您的并行测试无关,而是与 GetIt.I.reset()
是异步方法这一事实有关:
实施
Future<void> reset({bool dispose = true});
并且如 documentation of the package 中针对此方法所述:
[...] As dispose functions can be async, you should await this function.
代码示例
我根据您提供的代码并受到 unit tests written for the package 的启发制作了一个新的测试示例,它似乎工作正常。
import 'package:flutter_test/flutter_test.dart';
import 'package:get_it/get_it.dart';
import 'package:so_tests/my_dependency.dart';
void main() {
// This method provided by `flutter_test` is called before each test.
setUp(() async {
// Make sure the instance is cleared before each test.
await GetIt.I.reset();
});
group('tests', () {
test('test1', () {
final getIt = GetIt.instance;
getIt.registerSingleton(MyDependency());
// Some code using getIt<MyDependency>()
});
test('test2', () {
final getIt = GetIt.instance;
getIt.registerSingleton(MyDependency());
// Some code using getIt<MyDependency>()
});
});
}