【发布时间】:2021-03-23 17:59:05
【问题描述】:
我正在尝试使用 Dio 创建超时测试,我希望得到类型为 CONNECT_TIMEOUT 的 DioError 然后抛出自定义异常
我的测试我用 Mockito 模拟 Dio 并尝试抛出 DioError
test(
'Should throw [ConnectionTimeOutException] when reach timeout',
() async {
//arange
when(mockNetworkInfo.isConnected).thenAnswer((_) async => true);
when(mockDio.post(paths.login, data: tParams.toJson())).thenThrow(
(_) async => DioError(type: DioErrorType.CONNECT_TIMEOUT));
//act
final call = loginDataSource.login;
//assert
expect(() => call(params: tParams),
throwsA(TypeMatcher<ConnectTimeOutException>()));
},
);
我的数据源类:
class LoginDataSourceImpl implements LoginDataSource {
final Dio dio;
final NetworkInfo networkInfo;
LoginDataSourceImpl({@required this.dio, @required this.networkInfo});
@override
Future<CredencialModel> login({@required Params params}) async {
if (!await networkInfo.isConnected) {
throw NoNetworkException();
}
try {
final response = await dio.post(paths.login, data: params.toJson());
if (response.statusCode == 200) {
return CredencialModel.fromJson(response.data);
} else if (response.statusCode == 400) {
final error = ResponseError.fromJson(response.data);
switch (error.error) {
case 'invalid_request':
throw InvalidRequestException();
break;
case 'invalid_device':
throw InvalidDeviceException();
break;
case 'invalid_user_credentials':
throw InvalidUserCredentialException();
break;
case 'user_disabled':
throw UserDisableException();
default:
throw UnknowException();
}
} else if (response.statusCode == 500) {
throw ServerException();
} else {
throw UnknowException();
}
} on DioError catch (e) {
if (e.type == DioErrorType.CONNECT_TIMEOUT) {
throw ConnectTimeOutException();
} else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
} else {
throw UnknowException();
}
}
}
}
测试结果是:
Expected: throws <Instance of 'ConnectTimeOutException'>
Actual: <Closure: () => Future<CredencialModel>>
Which: threw <Closure: (dynamic) => DioError>
stack package:mockito/src/mock.dart 385:7
如何解决这个问题并使用 Dio 创建超时测试?
【问题讨论】:
-
你可以尝试在那个
call上扔一个await。 -
另外,
thenThrow接受您传递给它的任何对象并将其作为错误抛出。你给了它一个闭包对象。该闭包不会被调用,只是被抛出。将其更改为thenThrow(DioError(type: DioErrorType.CONNECT_TIMEOUT))。 -
你是对的@Abion47,谢谢,请把你的评论作为答案,这样我就可以标记为解决方案。
标签: flutter unit-testing dart dio