如何在Flutter Integration测试中最好地存根/模拟其余API调用

时间:2019-03-13 13:43:42

标签: dart flutter flutter-test

我有一个Flutter应用程序,该应用程序在用户登录后显示数据。 我已经进行了单元和窗口小部件测试,现在想编写我的第一个Integration /端到端测试来测试用户登录并查看数据的整个“快乐之路”工作流程。

当应用程序调用登录API(GET login_api_path)时,我想返回一些预定义的JSON以显示在屏幕上,而不是向服务器发出真正的请求。

这是一种明智的方法吗?如果是,这样做的最佳方法是什么?我发现的大多数资源都是用于单元测试的。

谢谢

1 个答案:

答案 0 :(得分:1)

这是我采用的方法:

创建使用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());