Flutter使用Mockito模拟http post请求始终返回null问题求助
问题修复方案
1. 修复业务代码属性调用错误
Flutter官方http库的Response对象使用body属性获取响应内容,而非data(data是Dio库的响应属性),你的代码此处调用了不存在的属性会直接触发异常,进入catch分支抛出ServerException。
修改代码:
// 原代码 var parsedJson = json.decode(response.data); // 修改后 var parsedJson = json.decode(response.body);
2. 修复Mock参数匹配规则
你调用client.post时传入了3个参数:Uri对象、body、headers,但when语句仅匹配了第一个位置参数,剩余命名参数没有匹配规则,导致Mock未命中返回默认null。
修改测试用例的when逻辑:
when(clientMock.post( any, body: anyNamed('body'), headers: anyNamed('headers') )).thenAnswer((_) async => http.Response(jsonMockResponse, 400));
3. 修复Mock响应的JSON格式错误
标准JSON要求所有字符串键、字符串值必须用双引号包裹,你当前写的Mock响应不符合JSON规范,json.decode解析时会直接抛出异常。
修改Mock响应内容:
String jsonMockResponse = '{"non_field_errors": ["Unable to log in with provided credentials."]}';
4. 修复异常断言写法
如果提前await异步函数,异常会在await阶段直接抛出,无法进入expect逻辑。需要直接把异步函数调用传入expect,由框架内部处理执行和异常捕获。
修改断言代码:
expect( remoteData.signIn('test@email.com', 'password123'), throwsA(const TypeMatcher<ServerException>()) );
完成以上修改后即可正常完成测试逻辑。
内容的提问来源于stack exchange,提问作者pksasso
相关产品推荐
相关产品推荐

