首页 > 解决方案 > 如何在 Dart/Flutter 中测试 void 静态方法?

问题描述

我正在尝试对具有静态 void 方法的类进行单元测试。

我正在使用 Mockito (verify) 来检查 void 方法是否按预期调用另一个函数,但它不适用于静态方法。

class SystemUtils {
  // ...

  static void handleError(bool isDebug, FlutterErrorDetails details) {
    if (isDebug) {
      FlutterError.dumpErrorToConsole(details);
    } else {
      Crashlytics.instance.onError(details);
    }
  }
}

标签: testingflutterdart

解决方案


我解决了改变班级。

该方法不再是静态的,现在我在构造函数中接收外部方法作为默认值。

import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/cupertino.dart';

class SystemUtils {
  SystemUtils({
    debugErrorHandler,
    releaseErrorHandler,
  })  : _debugErrorHandler =
            debugErrorHandler ?? FlutterError.dumpErrorToConsole,
        _releaseErrorHandler =
            releaseErrorHandler ?? Crashlytics.instance.onError;

  final void Function(FlutterErrorDetails) _debugErrorHandler;
  final void Function(FlutterErrorDetails) _releaseErrorHandler;

  static bool isInDebugMode() {
    bool inDebugMode = false;
    assert(inDebugMode = true);

    return inDebugMode;
  }

  void handleError(bool isDebug, FlutterErrorDetails details) {
    if (isDebug) {
      _debugErrorHandler(details);
    } else {
      _releaseErrorHandler(details);
    }
  }
}

现在我可以在需要时替换构造函数上的方法(例如在测试中)。

group('handleError', () {
    test('should call _debugErrorHandler if isDebug is true', () {
      const isDebug = true;
      const details = FlutterErrorDetails(exception: 'error exception');

      void debugErrorHandler(FlutterErrorDetails localDetails) {
        expect(localDetails, details);
      }

      final SystemUtils systemUtils = SystemUtils(debugErrorHandler: debugErrorHandler);

      systemUtils.handleError(isDebug, details);
    });
});

但我仍然想知道是否可以在 Dart 中测试 void 静态方法。


推荐阅读