Как лучше всего заглушать / имитировать вызовы rest API в интеграционных тестах Flutter

#dart #flutter #flutter-test

#dart #flutter #flutter-test

Вопрос:

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

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

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

Ответ №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());