如何在Dart / Flutter中测试void静态方法?

时间:2019-07-23 18:21:05

标签: testing flutter dart

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

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

class SystemUtils {
  // ...

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

2 个答案:

答案 0 :(得分:0)

我解决了换班的问题。

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

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静态方法。

答案 1 :(得分:0)

我认为您正在寻找的内容(示例):

要测试的代码:

class TestExpect {
  static void noParameter() {
    bool inDebugMode = false;
    assert(inDebugMode = false);
  }

  static void hasParameter(bool toBeIgnored) {
    bool inDebugMode = false;
    assert(inDebugMode = false);
  }
}

单元测试代码:

void main() {
  test('static void method', () {
    expect(TestExpect.noParameter, throwsA(isA<AssertionError>()));
  });

  test('static void method parameter', () {
    expect(() => TestExpect.hasParameter(true), throwsA(isA<AssertionError>()));
  });
}