Как сделать модульный тест с двумя фьючерсами внутри одного и того же метода?

я использую mockitoпакет для создания модульных тестов. В документации говорится только о простом будущем модульном тестировании. В моем случае я столкнулся с методом, который использует два метода Futures. Примеры, которые я имею в виду, LocalDatabaseа также RemoteDatabase. Поток должен получать данные из локальной базы данных и отправлять их в удаленную базу данных.

Вот образец, который я использую:

      import 'package:flutter_test/flutter_test.dart';

import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';

import 'mock_multiple_awaits_test.mocks.dart';

class MultipleAsync {
  final CacheStorage cacheStorage;
  final HttpClient httpClient;
  final String key;
  final String url;

  MultipleAsync({
    required this.cacheStorage,
    required this.httpClient,
    required this.key,
    required this.url,
  });

  void test() async {
    final result = await cacheStorage.fetch(key);
    httpClient.post(url, result, {'Content-Type': 'application/json'});
  }
}

abstract class CacheStorage {
  Future<dynamic> fetch(String key);
}

abstract class HttpClient {
  Future<dynamic> post(
      String url, Map<dynamic, dynamic> body, Map<dynamic, dynamic> headers);
}

@GenerateMocks([], customMocks: [
  MockSpec<CacheStorage>(as: #CacheStorageSpy),
  MockSpec<HttpClient>(as: #HttpClientSpy),
])
void main() {
  late MultipleAsync sut;
  late CacheStorage cacheStorage;
  late HttpClient httpClient;
  late String key;
  late String url;
  late Map headers;
  late Map body;

  PostExpectation mockFetchCall() => when(cacheStorage.fetch(key));

  void mockFetch(dynamic value) =>
      mockFetchCall().thenAnswer((_) async => value);

  PostExpectation mockPostCall() => when(httpClient.post(url, body, headers));

  void mockPost(dynamic value) => mockPostCall().thenAnswer((_) async => value);

  setUp(() {
    cacheStorage = CacheStorageSpy();
    httpClient = HttpClientSpy();
    key = 'key';
    url = 'https://example.com/api/v1/users/1';
    body = {'id': '1', 'name': 'John'};
    headers = {'Content-Type': 'application/json'};
    sut = MultipleAsync(
      cacheStorage: cacheStorage,
      key: key,
      httpClient: httpClient,
      url: url,
    );
    mockFetch(body);
    mockPost(body);
  });

  test('Should call MultipleAsync with correct values', () async {
    // act
    sut.test();
    // assert
    verify(cacheStorage.fetch(key)).called(1);
    verify(
      httpClient.post(
        url,
        body,
        headers,
      ),
    ).called(1);
  });
}

Вот ошибка. Тест не может найти второй метод httpclient.post.

0 ответов

Другие вопросы по тегам