繁体   English   中英

使用 GetIt 时在 flutter 中并行运行的单元测试

[英]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});

正如package 的文档中提到的这种方法:

[...] 因为 dispose 函数可以是异步的,所以你应该等待这个 function。

代码示例

我根据您提供的代码制作了一个新的测试样本,并受到为 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>()
    });
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM