Плохое состояние: фиктивный метод не был вызван в `when ()`. Был ли вызван настоящий метод? - PullRequest
5 голосов
/ 29 марта 2019

Я пытаюсь создать макет флаттера httpRequest с помощью mockito.

Здесь я определяю глобальный http-клиент:

library utgard.globals;

import 'package:http/http.dart' as http;

http.Client httpClient = http.Client();

Затем меняю в интеграционном тестировании:

import 'package:flutter_driver/driver_extension.dart';
import 'package:http/http.dart' as http;
import 'package:utgard/globals.dart' as globals;
import 'package:mockito/mockito.dart';

import 'package:utgard/main.dart' as app;

class MockClient extends Mock implements http.Client {}

void main() {
  final MockClient client = MockClient();
  globals.httpClient = client;

  enableFlutterDriverExtension();

  app.main();
}

Затем я пытаюсь использовать when из mockito:

test('login with correct password', () async {
      final client = MockClient();

      when(globals.httpClient.post('http://www.google.com'))
          .thenAnswer((_) async => http.Response('{"title": "Test"}', 200));

      await driver.enterText('000000');
      await driver.tap(loginContinuePasswordButton);
    });

Но я получаю следующую ошибку:

Плохое состояние: Mockметод не был вызван в when().Был ли вызван настоящий метод?

1 Ответ

0 голосов
/ 30 мая 2019

Решение, которое я нашел, состояло в том, чтобы определить макет в test_driver / app.dart и после этого вызвать функцию runApp, таким образом вы можете применить макет даже при тестировании интеграции флаттера:

import 'package:flutter/widgets.dart';
import 'package:flutter_driver/driver_extension.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:utgard/business/config/globals.dart';
import 'package:utgard/main.dart' as app;

class MockClient extends Mock implements http.Client {}

void main() {
  enableFlutterDriverExtension();

  final MockClient client = MockClient();
  // make your mocks here
  httpClient = client;

  runApp(app.MyApp());
}

Поскольку он может стать огромным кодом для макетирования всех запросов, вы можете создать отдельную функцию для лучшей организации кода:

import 'package:flutter/widgets.dart';
import 'package:flutter_driver/driver_extension.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:utgard/business/config/globals.dart';
import 'package:utgard/main.dart' as app;

class MockClient extends Mock implements http.Client {}

void main() {
  enableFlutterDriverExtension();

  final MockClient client = MockClient();
  makeMock();
  httpClient = client;

  runApp(app.MyApp());
}
...