MissingPluginException(在通道plugins.it_nomads.com/flutter_secure_storage上读取的方法未找到实现)

问题描述 投票:0回答:4

我正在尝试为 ApiBaseHelper 方法编写一些单元测试(负责所有 HTTP 请求)。

class ApiBaseHelper {
  String _baseUrl = "${Config.get('apiUrl')}/";
  Dio _dio = Dio()..interceptors.add(DioCustomInterceptors());

  ApiBaseHelper({Dio? dio}) {
    _dio = dio ?? Dio()
      ..interceptors.add(DioCustomInterceptors());
    _dio.options.baseUrl = _baseUrl;
  }

  Future<dynamic> get(String url, [Map<String, dynamic>? query]) async {
    try {
      Response<String> response =
          await _dio.get(_baseUrl + url, queryParameters: query);
      if (response.statusCode == 200) {
        return response.data;
      }
    } on DioError catch (e) {
      _returnException(e.response);
    }
  }
}

这是我尝试测试 GET 方法的文件,我使用 Dio 包

import 'package:app/utils/services/network/api_base_helper.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:http_mock_adapter/http_mock_adapter.dart';

const successMessage = {'message': 'Success'};
const errorMessage = {'message': 'error'};
const testPath = 'test';
const testData = {'data': 'sample data'};
const header = {'Content-Type': 'application/json'};

void main(){
  WidgetsFlutterBinding.ensureInitialized() ;
  final dio = Dio();
  final dioAdapter = DioAdapter(dio: dio);
  var baseUrl;


  setUp(() {
    dio.httpClientAdapter = dioAdapter;
    baseUrl = 'https://example.com/';
  });

  group("", (){
    test('Test Get', () async {
      dioAdapter.onGet(
        '$baseUrl$testPath',
            (request) {
          return request.reply(200, successMessage);
        },
        data: null,
        queryParameters: {},
        headers: {},
      );
      final service = ApiBaseHelper(
        dio: dio,
      );
      final response = await service.get('test');
      expect(response, successMessage);
    });
  });
}

当我运行测试时,我遇到了这个错误

package:flutter/src/services/platform_channel.dart 175:7       MethodChannel._invokeMethod
===== asynchronous gap ===========================
dart:async                                                     _asyncErrorWrapperHelper
package:dio/src/dio_mixin.dart 502:28                          DioMixin.fetch._requestInterceptorWrapper.<fn>.<fn>.<fn>
package:dio/src/dio_mixin.dart 818:22                          DioMixin.checkIfNeedEnqueue
package:dio/src/dio_mixin.dart 500:22                          DioMixin.fetch._requestInterceptorWrapper.<fn>.<fn>
===== asynchronous gap ===========================
dart:async                                                     new Future
package:dio/src/dio_mixin.dart 499:13                          DioMixin.fetch._requestInterceptorWrapper.<fn>
package:dio/src/dio_mixin.dart 494:14                          DioMixin.fetch._requestInterceptorWrapper.<fn>
===== asynchronous gap ===========================
dart:async                                                     Future.then
package:dio/src/dio_mixin.dart 581:23                          DioMixin.fetch.<fn>
dart:collection                                                ListMixin.forEach
package:dio/src/dio_mixin.dart 577:18                          DioMixin.fetch
package:dio/src/dio_mixin.dart 468:12                          DioMixin.request
package:dio/src/dio_mixin.dart 55:12                           DioMixin.get
package:app/utils/services/network/api_base_helper.dart 19:22  ApiBaseHelper.get
test/network/api_base_helper_test.dart 40:38                   main.<fn>.<fn>
test/network/api_base_helper_test.dart 27:22                   main.<fn>.<fn>

MissingPluginException(No implementation found for method read on channel plugins.it_nomads.com/flutter_secure_storage)

我正在使用 flutter secure storage 来存储用户凭证,但在这里我只是想测试 ApiBaseHelper。有什么帮助吗?

flutter unit-testing dart
4个回答
10
投票

当我尝试测试 Flutter_Secure_Storage 提供的不同方法时,我遇到了完全相同的错误。

我能够通过在 setUpAll 函数中编写以下内容来解决该问题:

setUpAll(() {
  FlutterSecureStorage.setMockInitialValues({});
});

更多信息在这里:Flutter 测试 MissingPluginException

希望这有帮助。


4
投票

停止应用程序调试并重新启动它。这必须解决问题


0
投票

当我的integration_test位于/test/integration_test下时,我遇到了同样的错误

尝试将测试文件夹代码直接放置在项目根文件夹中,例如 /test 或 /integration_test(与 /lib 处于同一级别)


0
投票

这个问题我遇到过两次,解决办法都是推迟阅读。 首先,您必须确信一切都已构建完成。然后调用 _load() 方法。 上次我构建了所有内容,并让用户点击控件来调用 _load() 方法。 我这样做是为了避免长时间出现黑屏,但我确信还有其他方法可以应用这个想法。

© www.soinside.com 2019 - 2024. All rights reserved.