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
相关产品推荐
相关产品推荐

