如何最好地 stub/mock 在 Flutter 集成测试中休息 API 调用
How best to stub/mock rest API calls in Flutter Integration tests
我有一个 Flutter 应用程序,它在用户登录后显示数据。
我有单元和小部件测试,现在想编写我的第一个 Integration/端到端测试来测试用户登录并查看数据的整个 'happy path' 工作流程。
当应用程序调用登录 API (GET login_api_path) 我想 return 一些预定义的 JSON 用于在屏幕上显示的内容而不是向服务器发出真正的请求。
这是一种明智的方法吗?如果是,最好的方法是什么?我发现的大多数资源都是专门用于单元测试的。
这是我采用的方法:
创建一个使用 Dart http MockClient 的模拟客户端:
import 'package:http/testing.dart';
import 'package:http/http.dart';
MockClient integrationTestMockClient = MockClient((request) async {
switch (request.url.toString()) {
case 'https://staging.company.com/api/customer/123':
return Response('{"customer": "123", "name": "Jane Jimmy"}', 200);
case 'https://staging.company.com/api/customer/155':
return Response('{"customer": "155", "name": "Gregor"}', 200);
}
}
现在,当您在集成测试中启动您的应用程序时,例如,您需要将模拟客户端传递到您的应用程序中。 test_driver/app.dart
import 'mock_client.dart';
void main() async {
enableFlutterDriverExtension();
final app = await initializeApp(
integrationMockClient,
);
runApp(app);
}
您可能需要重构非测试代码,以便在应用启动时注入客户端。测试时要么是真实客户端,要么是模拟客户端。
import 'package:http/http.dart';
void main() => initializeApp(Client());
我有一个 Flutter 应用程序,它在用户登录后显示数据。 我有单元和小部件测试,现在想编写我的第一个 Integration/端到端测试来测试用户登录并查看数据的整个 'happy path' 工作流程。
当应用程序调用登录 API (GET login_api_path) 我想 return 一些预定义的 JSON 用于在屏幕上显示的内容而不是向服务器发出真正的请求。
这是一种明智的方法吗?如果是,最好的方法是什么?我发现的大多数资源都是专门用于单元测试的。
这是我采用的方法:
创建一个使用 Dart http MockClient 的模拟客户端:
import 'package:http/testing.dart';
import 'package:http/http.dart';
MockClient integrationTestMockClient = MockClient((request) async {
switch (request.url.toString()) {
case 'https://staging.company.com/api/customer/123':
return Response('{"customer": "123", "name": "Jane Jimmy"}', 200);
case 'https://staging.company.com/api/customer/155':
return Response('{"customer": "155", "name": "Gregor"}', 200);
}
}
现在,当您在集成测试中启动您的应用程序时,例如,您需要将模拟客户端传递到您的应用程序中。 test_driver/app.dart
import 'mock_client.dart';
void main() async {
enableFlutterDriverExtension();
final app = await initializeApp(
integrationMockClient,
);
runApp(app);
}
您可能需要重构非测试代码,以便在应用启动时注入客户端。测试时要么是真实客户端,要么是模拟客户端。
import 'package:http/http.dart';
void main() => initializeApp(Client());