Как лучше всего заглушить / смоделировать остальные вызовы API в интеграционных тестах Flutter - PullRequest
1 голос
/ 13 марта 2019

У меня есть приложение Flutter, которое отображает данные после входа пользователя в систему. У меня есть тесты юнитов и виджетов, и теперь я хотел бы написать свой первый Интеграционный / сквозной тест для проверки всего ».рабочий процесс «счастливый путь», в котором пользователь входит в систему и просматривает данные.

Когда приложение отправляется для вызова API входа в систему (GET login_api_path), я хочу вернуть некоторый предопределенный JSON для отображения на экране, а не для созданияреальный запрос к серверу.

Это разумный подход, и если да, то каков наилучший способ сделать это?Большинство ресурсов, которые я нашел, были специально для модульного тестирования.

Спасибо

1 Ответ

1 голос
/ 29 марта 2019

Вот подход, с которым я пошел:

Создайте фиктивный клиент, который использует 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());
...