Дарт и Мокито. Как вызвать аргумент Function () в смоделированном методе - PullRequest
2 голосов
/ 18 октября 2019

Я использую Mockito для написания тестов на Flutter. У меня есть ложный класс и метод с аргументами, которые являются функциями - Function (), и этот метод возвращает StreamSubscription. Мне нужно передать эти аргументы на вызов функции listen(), но я не могу найти способ сделать это. (См. Пример) Может ли кто-нибудь помочь мне, пожалуйста?

Я пытался передать их с argThat(anyNamed('nameOfArgument'), как в примере, но проверяет ошибку trows - сопоставление аргументов "anyNamed" используется вне заглушки метода (черезwhen)

class MockPhotoLibraryService extends Mock implements PhotoLibraryService {}

PhotoLibraryService setupMockPhotoLibraryService() {
  final photoLibraryService = MockPhotoLibraryService();

  when(
    photoLibraryService.getPhotosForPeriod(
        onData: anyNamed('onData'),
        onDone: anyNamed('onDone'),
        onError: anyNamed('onError')),
  ).thenAnswer((_) => Stream<Photo>.fromFuture(
          Future<Photo>.delayed(Duration(milliseconds: 50), () => Photo()))
      .listen(argThat(anyNamed('onData')), //need to pass argument named onData
          onDone: argThat(anyNamed('onDone')), //need to pass argument named onDone
          onError: argThat(anyNamed('onError')), //need to pass argument named onError
          cancelOnError: true));

  return photoLibraryService;
}

Мне нужно, чтобы Future вызывал функции этих аргументов для корректной работы моего тестируемого виджета.

1 Ответ

0 голосов
/ 21 октября 2019

Вы можете получить доступ к исходным параметрам вызова через Invocation объект. Он передается в качестве параметра функции обратного вызова thenAnswer.

when(photoLibraryService.getPhotosForPeriod(
  onData: anyNamed('onData'),
  onDone: anyNamed('onDone'),
  onError: anyNamed('onError'),
)).thenAnswer((Invocation invocation) {
  final namedArgs = invocation.namedArguments;
  final onData = namedArgs[Symbol('onData')] as Function(Photo);
  final onDone = namedArgs[Symbol('onDone')] as Function();
  final onError = namedArgs[Symbol('onError')] as Function(dynamic);

  return Stream<Photo>.fromFuture(
    Future<Photo>.delayed(Duration(milliseconds: 50), () => Photo()),
  ).listen(onData, onDone: onDone, onError: onError, cancelOnError: true);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...