Dart/Flutter:在测试套件之间共享通用的 setUp/tearDown 方法

dav*_*ode 5 testing unit-testing dart flutter

有没有办法在 Dart/Flutter 的测试中共享通用的 setUp/tearDown 方法和其他辅助方法?通常在其他语言/框架中,比如 Java 或 Python,测试是在可以扩展的类中定义的,但是 Dart 通过在 main 方法中使用函数来进行测试的方式让我感到困惑。例如,我正在测试 io 方法,我的测试中有以下代码:

  Directory tempDir;

  setUp(() async {
    tempDir = await Directory.systemTemp.createTemp();

    const MethodChannel('plugins.flutter.io/path_provider').setMockMethodCallHandler((MethodCall methodCall) async {
      if (methodCall.method == 'getApplicationDocumentsDirectory') {
        return tempDir.path;
      }
      return null;
    });
  });

  tearDown(() async {
    tempDir.delete(recursive: true);
  });
Run Code Online (Sandbox Code Playgroud)

如果是任何其他语言,我将创建一个基类或一个名为的 mixin,TempDirTestCase在其中放置用于创建/删除临时目录的代码,那么每个需要此类功能的套件只需从它继承......但是我应该在 dart/flutter 中做什么来重用代码并避免复制/粘贴?

Tom*_*der 12

创建一个在与测试相同的目录中调用的文件flutter_test_config.dart(或者在更高级别,它将影响该目录及以下目录中的所有测试)。

在该文件中,您可以在测试文件的方法运行之前调用setUp和方法:tearDownmain

import 'dart:async';
import 'package:flutter_test/flutter_test.dart';

Future<void> testExecutable(FutureOr<void> Function() testMain) async {
  setUp(() {
    print('Shared setUp');
  });

  tearDown(() {
    print('Shared tearDown');
  });

  await testMain();
}
Run Code Online (Sandbox Code Playgroud)

文档:https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html