飞镖和莫基托。如何在模拟方法中调用 Function() 参数

Val*_*aha 4 mockito dart

我使用 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;
}
Run Code Online (Sandbox Code Playgroud)

我需要 Future 调用这些参数函数,以便我的可测试小部件正确工作。

Nik*_*nen 5

您可以通过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);
});
Run Code Online (Sandbox Code Playgroud)