我正在使用http_mock_adaper來模擬 Dio HTTP 請求。這部分作業正常,但我遇到的問題是驗證請求是否已使用。
我的一個想法是verify()使用dio.get(any)或adapter.onGet(any, any)作為引數呼叫 mockito ,但這顯然行不通,因為這些類不是使用 mockito 模擬的。
我的另一個選擇是模擬呼叫 dio 的類,但這意味著我必須存根呼叫的每個方法(同樣,因為實際的 HTTP 呼叫已經被模擬),如果可能的話,我想避免這種情況.
有沒有辦法驗證是否使用 http_mock_adaper 進行了 HTTP 呼叫,或者我的最后一個選項是唯一/最佳解決方案?
uj5u.com熱心網友回復:
只是一個基本想法的例子。但它可以足夠靈活(也適用于錯誤和回應)。
如果我們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 one rror(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': '[email protected]',
'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);
});
//...
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/365016.html
