如何验证是否已使用 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);
    });

    //...
  });
}