Как сделать модульный тест с двумя фьючерсами внутри одного и того же метода?
я использую
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.