You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter仓库测试类网络校验未通过,API调用未覆盖问题排查

问题:Repository测试未覆盖网络校验通过后的API调用逻辑

我们采用TDD架构,在Repository测试类中,调用API前需检查网络连通性,但当前测试中网络校验通过的场景下,API调用逻辑未被覆盖,导致代码覆盖率不达标。

仓库类代码

class LoginRepositoryImpl extends LoginRepository {
  LoginLocalSrc localSrc;
  late NetworkConnectivity networkConnectivity = NetworkConnectivity.instance;

  LoginRepositoryImpl(this.localSrc);

  @override
  Future<Either<Failure, LoginModel?>> loginApiCall(
      String userName, String password, FieldType fieldType) async {
    try {
      var isOnline = await networkConnectivity.checkNetwork();
      if (isOnline) {
        var response = await localSrc.login(userName, password, fieldType);
        return Right(response);
      } else {
        return Left(
            FailureMessage(message: AppStrings.kInternetNotAvailableMsg));
      }
    } catch (e) {
      return Left(await getError(e));
    }
  }
}

测试类代码

class TestLoginLocalSrc extends Mock implements LoginLocalSrc {}

class TestNetworkConnectivity extends Mock implements NetworkConnectivity {}

@GenerateNiceMocks([MockSpec<TestLoginLocalSrc>()])
@GenerateNiceMocks([MockSpec<TestNetworkConnectivity>()])
void main() {
  late ModelFinder modelfinder;
  late TestLoginLocalSrc mockLoginLocalSrc;
  late LoginRepositoryImpl loginRepositoryImpl;
  late TestNetworkConnectivity networkConnectivity;

  setUp(() {
    modelfinder = ModelFinder();
    mockLoginLocalSrc = MockTestLoginLocalSrc();
    networkConnectivity = MockTestNetworkConnectivity();
    loginRepositoryImpl = LoginRepositoryImpl(mockLoginLocalSrc);
  });

  void runTestsOnline(Function body) {
    group('device is online', () {
      setUp(() {
        when(networkConnectivity.checkNetwork()).thenAnswer((_) async => true);
      });

      body();
    });
  }

  group(' ', () {
    runTestsOnline(() {
      test(
        'should return remote data when the call to remote data source is successful',
        () async {
          // arrange
          when(mockLoginLocalSrc.login("username", "", FieldType.mobile))
              .thenAnswer((_) async => modelfinder.loginModelFun());
          // act
          final Either<Failure, LoginModel?> result = await loginRepositoryImpl
              .loginApiCall("username", "", FieldType.mobile);
          // assert
          expect(result, equals(Left(FailureMessage(message: "error"))));
        },
      );

      test(
        'should return server failure when the call to remote data source is unsuccessful',
        () async {
          // arrange
          when(mockLoginLocalSrc.login("username", "", FieldType.mobile))
              .thenAnswer((_) async => modelfinder.loginModelFun());
          // act
          final Either<Failure, LoginModel?> result = await loginRepositoryImpl
              .loginApiCall("username", "", FieldType.mobile);
          // assert
          verifyZeroInteractions(mockLoginLocalSrc);
          expect(result, equals(Left(FailureMessage(message: "error"))));
        },
      );
    });
  });
}

当前代码覆盖率情况

代码覆盖率截图

内容的提问来源于stack exchange,提问作者Farhana Naaz Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:25:12