模拟 Dio 无法在 Flutter 中测试我的应用程序

Hen*_*aro 2 testing mockito dart flutter dio

我正在尝试使用 Dio 为我的请求编写单元测试,但我不断收到此错误: 类型“Null”不是类型“BaseOptions”的子类型

我尝试以多种不同的方式在 DioMock 上添加基本选项,但测试保持不变。我该如何修复它?

以下是我的网络课程和测试课程。

class NetworkService {

  final Dio dio;

  NetworkService(this.dio){
    dio.options.baseUrl = "https://food2fork.ca/api/recipe/search";
    dio.options.headers['Authorization'] = 'Token 9c8b06d329136da358c2d00e76946b0111ce2c48';

    dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler){
        print('base ${options.baseUrl}');
        print("PATH: ${options.path}");
        return handler.next(options);
      },
      onResponse: (response, handler){
        print("RESPONSE: ${response.statusCode}  PATH: ${response.requestOptions.path}");
    return handler.next(response);
    },
      onError: (DioError e, handler){
        print("ERROR: ${e.response?.statusCode} => PATH: ${e.requestOptions.path}");
        return handler.next(e);
      }
    ));
  }

  Future<List<Recipe>> getRecipe() async {
    var response = await dio.get('/?page=1&query=beef');
    print("response ${response.data}");
    if(response.statusCode == 200){
      final List<Recipe> recipeList = [];
      for(Map<String, dynamic> recipe in response.data['results']){
        recipeList.add(Recipe.fromJson(recipe));
      }
      return recipeList;
    } else {
      throw Exception('sss');
    }

  // ONBOARDING
  }
}
Run Code Online (Sandbox Code Playgroud)
class DioMock extends Mock implements DioForNative {}

class RecipeMock extends Mock implements Recipe {}

main() {

  final dio = DioMock();

  final service = NetworkService(dio);

  dio.options.baseUrl = "https://food2fork.ca/api/recipe/search";
  dio.options.headers =  { 'Content-type': 'application/json', 'Accept': 'application/json' };

  test("should return Onboarding Model", () async {
    final response = Response(
        requestOptions: RequestOptions(
            path: 'gfh',
          baseUrl: "fgh"
        ),
        data: RecipeMock()

    );
    when(dio.get(
        "https://food2fork.ca/api/recipe/search"))
        .thenAnswer((_) async => response);

    final result = await service.getRecipe();
    expect(result, isA<Recipe>());

  });
}
Run Code Online (Sandbox Code Playgroud)

Cét*_*tia 6

您应该使用https://pub.dev/packages/http_mock_adapter包来帮助您模拟 DIO 请求

请参阅其示例https://github.com/lomsa-dev/http-mock-adapter/blob/main/example/main.dart

void main() async {
  late Dio dio;
  late DioAdapter dioAdapter;

  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);
    });

    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);

      expect(response.statusCode, 201);
    });

...
Run Code Online (Sandbox Code Playgroud)

  final dioError = DioError(
    error: {'message': 'Some beautiful error!'},
    requestOptions: RequestOptions(path: path),
    response: Response(
      statusCode: 500,
      requestOptions: RequestOptions(path: path),
    ),
    type: DioErrorType.response,
  );

  test("should return a DioError", () async {
    dioAdapter.onGet(
        path,
            (server) {
          server.throws(404, dioError );
        });
    final result = await service.getOnboardingAnswer("lastAnswerId");
    expect(result, throwsA(isA<DioError>()));
  });
}
  });
Run Code Online (Sandbox Code Playgroud)