簡體   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