【问题标题】:How to mock Flutter Fire Firebase Functions correctly?如何正确模拟 Flutter Fire Firebase 函数?
【发布时间】:2021-03-06 03:42:06
【问题描述】:

我正在尝试从 Flutter Fire 模拟 Firebase Functions 包,但我不断收到错误。

这是我创建 Mock 的尝试。但是call 函数在我尝试覆盖它时给了我错误,因为返回类型不正确。

library firebase_cloud_functions_mock;

import 'dart:convert';

import 'package:cloud_functions/cloud_functions.dart';
import 'package:mockito/mockito.dart';

class MockFirebaseFunctions extends Mock implements FirebaseFunctions {
  final Map<String, String> _jsonStore = <String, String>{};

  String _convertMapToJson(Map<String, dynamic> parameters) {
    return json.encode(parameters);
  }

  void mockResult(
      {String functionName, String json, Map<String, dynamic> parameters}) {
    if (parameters?.isNotEmpty != null) {
      // ignore: parameter_assignments
      functionName = functionName + _convertMapToJson(parameters);
    }
    _jsonStore[functionName] = json;
  }

  String getMockResult(String functionName, Map<String, dynamic> parameters) {
    // ignore: parameter_assignments
    functionName = parameters == null
        ? functionName
        : (parameters?.isNotEmpty != null
            ? functionName + _convertMapToJson(parameters)
            : functionName);
    assert(
        _jsonStore[functionName] != null, 'No mock result for $functionName');
    return _jsonStore[functionName];
  }

  @override
  HttpsCallable getHttpsCallable({String functionName}) {
    return HttpsCallableMock._(this, functionName);
  }
}

class HttpsCallableMock extends Mock implements HttpsCallable {
  HttpsCallableMock._(this._firebaseFunctions, this._functionName);

  final MockFirebaseFunctions _firebaseFunctions;
  final String _functionName;

  @override
  Future<HttpsCallableResult> call([dynamic parameters]) {
    final decoded = json.decode(_firebaseFunctions.getMockResult(
        _functionName, parameters as Map<String, dynamic>));
    return Future.value(HttpsCallableResultMock._(decoded));
  }

  /// The timeout to use when calling the function. Defaults to 60 seconds.
  Duration timeout;
}

class HttpsCallableResultMock extends Mock implements HttpsCallableResult {
  HttpsCallableResultMock._(this.data);

  /// Returns the data that was returned from the Callable HTTPS trigger.
  @override
  final dynamic data;
}

有谁知道如何正确模拟 Flutter Fire 中的 Firebase Functions 包?

【问题讨论】:

    标签: flutter testing mocking google-cloud-functions flutter-test


    【解决方案1】:

    通过三个小改动,我能够使您的示例与 cloud_function-2.0.0 一起使用。

    1. HttpsCallableMock.call 中添加&lt;T&gt; 类型参数和 HttpsCallableResultMock.

    2. 替换覆盖 getHttpsCallablehttpsCallable

    3. 检查parameters?.isNotEmpty == true 而不是!= null。根据您在传递空参数时想要的行为,可能不需要此更改。

    这是更新后的代码。

    import 'package:cloud_functions/cloud_functions.dart';
    import 'package:mockito/mockito.dart';
    
    class MockFirebaseFunctions extends Mock implements FirebaseFunctions {
      final Map<String, String> _jsonStore = <String, String>{};
    
      String _convertMapToJson(Map<String, dynamic> parameters) {
        return json.encode(parameters);
      }
    
      void mockResult(
          {String functionName, String json, Map<String, dynamic> parameters}) {
        if (parameters?.isNotEmpty == true) {
          functionName = functionName + _convertMapToJson(parameters);
        }
        _jsonStore[functionName] = json;
      }
    
      String getMockResult(String functionName, Map<String, dynamic> parameters) {
        // ignore: parameter_assignments
        functionName = parameters == null
            ? functionName
            : (parameters?.isNotEmpty == true
            ? functionName + _convertMapToJson(parameters)
            : functionName);
        assert(
        _jsonStore[functionName] != null, 'No mock result for $functionName. \n Expected one of ${_jsonStore.keys}');
        return _jsonStore[functionName];
      }
    
      @override
      HttpsCallable httpsCallable(String functionName, {HttpsCallableOptions options}) {
        return HttpsCallableMock._(this, functionName);
      }
    }
    
    class HttpsCallableMock extends Mock implements HttpsCallable {
      HttpsCallableMock._(this._firebaseFunctions, this._functionName);
    
      final MockFirebaseFunctions _firebaseFunctions;
      final String _functionName;
    
      @override
      Future<HttpsCallableResult<T>> call<T>([dynamic parameters]) {
        final decoded = json.decode(_firebaseFunctions.getMockResult(
            _functionName, parameters as Map<String, dynamic>));
        return Future.value(HttpsCallableResultMock<T>._(decoded));
      }
    
      /// The timeout to use when calling the function. Defaults to 60 seconds.
      Duration timeout;
    }
    
    class HttpsCallableResultMock<T> extends Mock implements HttpsCallableResult<T> {
      HttpsCallableResultMock._(this.data);
    
      /// Returns the data that was returned from the Callable HTTPS trigger.
      @override
      final T data;
    }
    
    

    【讨论】:

    • 你能告诉我如何测试它吗? TIA
    猜你喜欢
    • 2020-11-09
    • 2020-04-25
    • 1970-01-01
    • 2019-01-04
    • 2021-01-24
    • 2021-04-11
    • 2021-08-30
    • 2022-01-20
    • 2021-11-21
    相关资源
    最近更新 更多