我正在尝试为 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_Secure_Storage 提供的不同方法时,我遇到了完全相同的错误。
我能够通过在 setUpAll 函数中编写以下内容来解决该问题:
setUpAll(() {
FlutterSecureStorage.setMockInitialValues({});
});
更多信息在这里:Flutter 测试 MissingPluginException
希望这有帮助。
停止应用程序调试并重新启动它。这必须解决问题。
当我的integration_test位于/test/integration_test下时,我遇到了同样的错误
尝试将测试文件夹代码直接放置在项目根文件夹中,例如 /test 或 /integration_test(与 /lib 处于同一级别)
这个问题我遇到过两次,解决办法都是推迟阅读。 首先,您必须确信一切都已构建完成。然后调用 _load() 方法。 上次我构建了所有内容,并让用户点击控件来调用 _load() 方法。 我这样做是为了避免长时间出现黑屏,但我确信还有其他方法可以应用这个想法。