如何验证是否已使用 http_mock_adapter 发出请求?
How can I verify that a request has been made using http_mock_adapter?
我正在使用 http_mock_adaper 模拟 Dio HTTP 请求。那部分工作正常,但我遇到的问题是验证请求是否已使用。
我的一个想法是用 dio.get(any)
或 adapter.onGet(any, any)
作为参数调用 mockito 的 verify()
,但这显然行不通,因为那些 classes没有使用 mockito 来模拟。
我的另一个选择是模拟调用 dio 的 class,但这意味着我必须对调用的每个方法进行存根(同样,因为实际的 HTTP 调用已经被模拟),如果可能的话,我想避免这种情况。
有没有办法验证是否已使用 http_mock_adaper 进行了 HTTP 调用,或者我的最后一个选项是唯一/最佳解决方案吗?
只是一个基本想法的例子。但它可以足够灵活(也适用于错误和响应)。
如果我们创建自己的 Interceptor
用于测试目的会怎么样:
class TestHistoryInterceptor extends Interceptor {
final requests = <String>[];
TestHistoryInterceptor();
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
requests.add(options.path);
handler.next(options);
}
@override
void onError(DioError err, ErrorInterceptorHandler handler) {
// err.requestOptions.path
handler.next(err);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
// response.requestOptions.path
handler.next(response);
}
void clear() {
requests.clear();
}
}
我们可以使用它(从 http_mock_adapter repo 更改示例):
void main() async {
late Dio dio;
late DioAdapter dioAdapter;
//#1
final testHistoryInterceptor = TestHistoryInterceptor();
Response<dynamic> response;
group('Accounts', () {
const baseUrl = 'https://example.com';
const userCredentials = <String, dynamic>{
'email': 'test@example.com',
'password': 'password',
};
setUp(() {
dio = Dio(BaseOptions(baseUrl: baseUrl));
dioAdapter = DioAdapter(dio: dio);
//#2
dio.interceptors.add(testHistoryInterceptor);
});
tearDown(() {
//#3
dio.interceptors.remove(testHistoryInterceptor);
testHistoryInterceptor.clear();
});
test('signs up user', () async {
const route = '/signup';
dioAdapter.onPost(
route,
(server) => server.reply(201, null),
data: userCredentials,
);
// Returns a response with 201 Created success status response code.
response = await dio.post(route, data: userCredentials);
//#4
expect(testHistoryInterceptor.requests, ["/signup"]);
expect(response.statusCode, 201);
});
//...
});
}
我正在使用 http_mock_adaper 模拟 Dio HTTP 请求。那部分工作正常,但我遇到的问题是验证请求是否已使用。
我的一个想法是用 dio.get(any)
或 adapter.onGet(any, any)
作为参数调用 mockito 的 verify()
,但这显然行不通,因为那些 classes没有使用 mockito 来模拟。
我的另一个选择是模拟调用 dio 的 class,但这意味着我必须对调用的每个方法进行存根(同样,因为实际的 HTTP 调用已经被模拟),如果可能的话,我想避免这种情况。
有没有办法验证是否已使用 http_mock_adaper 进行了 HTTP 调用,或者我的最后一个选项是唯一/最佳解决方案吗?
只是一个基本想法的例子。但它可以足够灵活(也适用于错误和响应)。
如果我们创建自己的 Interceptor
用于测试目的会怎么样:
class TestHistoryInterceptor extends Interceptor {
final requests = <String>[];
TestHistoryInterceptor();
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
requests.add(options.path);
handler.next(options);
}
@override
void onError(DioError err, ErrorInterceptorHandler handler) {
// err.requestOptions.path
handler.next(err);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
// response.requestOptions.path
handler.next(response);
}
void clear() {
requests.clear();
}
}
我们可以使用它(从 http_mock_adapter repo 更改示例):
void main() async {
late Dio dio;
late DioAdapter dioAdapter;
//#1
final testHistoryInterceptor = TestHistoryInterceptor();
Response<dynamic> response;
group('Accounts', () {
const baseUrl = 'https://example.com';
const userCredentials = <String, dynamic>{
'email': 'test@example.com',
'password': 'password',
};
setUp(() {
dio = Dio(BaseOptions(baseUrl: baseUrl));
dioAdapter = DioAdapter(dio: dio);
//#2
dio.interceptors.add(testHistoryInterceptor);
});
tearDown(() {
//#3
dio.interceptors.remove(testHistoryInterceptor);
testHistoryInterceptor.clear();
});
test('signs up user', () async {
const route = '/signup';
dioAdapter.onPost(
route,
(server) => server.reply(201, null),
data: userCredentials,
);
// Returns a response with 201 Created success status response code.
response = await dio.post(route, data: userCredentials);
//#4
expect(testHistoryInterceptor.requests, ["/signup"]);
expect(response.statusCode, 201);
});
//...
});
}