使用 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.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>()
    });
  });
}