Luk*_*uke 13 mocking dart flutter
我已经使用 Mocktail 编写了一个简单的 HTTP get 测试来模拟 HTTP 客户端。当我在测试中调用 get 方法时,我收到“类型‘Null’不是类型‘Future’的子类型”。
有人知道为什么会这样吗?
这是测试:
class MockHttpClient extends Mock implements http.Client {}
void main() {
late IdRemoteDataSourceImpl dataSource;
late MockHttpClient mockHttpClient;
setUp(
() {
mockHttpClient = MockHttpClient();
dataSource = IdRemoteDataSourceImpl(client: mockHttpClient);
},
);
group('Get id', () {
test(
'when response code is 200',
() async {
final url = Uri.parse('https://api.test.com/');
const tUsername = 'username';
final accountJson = json.decode(
fixture('account.json'),
// ignore: avoid_as
) as Map<String, dynamic>;
final tIdModel = IdModel.fromJson(accountJson);
// arrange
when(() => mockHttpClient.get(url))
.thenAnswer((_) async => http.Response(
fixture('account.json'),
200,
));
// act
final testResult = await dataSource.getId(tUsername);
// assert
// expect(testResult, tIdModel);
},
);
});
}
Run Code Online (Sandbox Code Playgroud)
运行以下行时会发生错误:
final testResult = await dataSource.getId(tUsername);
Run Code Online (Sandbox Code Playgroud)
正在测试的代码:
import 'dart:convert';
import 'package:http/http.dart' as http;
class IdModel {
IdModel({required this.id});
final String id;
factory IdModel.fromJson(Map<String, dynamic> json) {
return IdModel(id: json['id'].toString());
}
}
abstract class IdRemoteDataSource {
Future<IdModel> getId(String username);
}
class IdRemoteDataSourceImpl implements IdRemoteDataSource {
IdRemoteDataSourceImpl({required this.client});
final http.Client client;
@override
Future<IdModel> getId(String username) async {
final url = Uri.parse('https://api.test.com/query?username=$username');
final response = await client.get(url);
// ignore: avoid_as
final responseJson = json.decode(response.body) as Map<String, dynamic>;
return IdModel.fromJson(responseJson);
}
}
Run Code Online (Sandbox Code Playgroud)
Mol*_*0ko 20
type 'Null' is not a subtype of type 'Future'...当您调用尚未为模拟对象实现的方法或传递给它的参数不同时,就会发生错误。
在您的代码中,您将不同的 url 参数传递给get(...)方法。Http客户端mock正在等待'https://api.test.com/'但实际上'https://api.test.com/query?username=$username'已经通过了。
您有两种选择来解决它。
when(...)该方法将在测试期间传递:const tUsername = 'username';
final url = Uri.parse('https://api.test.com/query?username=$tUsername');
...
// arrange
when(() => mockHttpClient.get(url))
.thenAnswer((_) async => http.Response(
fixture('account.json'),
200,
),
);
Run Code Online (Sandbox Code Playgroud)
any匹配器(如果你不关心传递哪个参数):registerFallbackValue(Uri.parse(''));
...
when(() => mockHttpClient.get(any()))
.thenAnswer((_) async => http.Response(
fixture('account.json'),
200,
),
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10275 次 |
| 最近记录: |