使用 mockito 验证 NavigationService popUntil 调用

Verify NavigationService popUntil call using mockito

提问人:thenry 提问时间:11/9/2023 更新时间:11/9/2023 访问量:25

问:

我正在为我的 flutter 移动应用程序编写单元测试,我正在尝试测试一个函数,该函数在执行时应该弹出后退堆栈,直到满足路由函数的谓词。下面是测试代码和随附的导航代码的示例:

group('popUntilHomeView - ', () {
  test(
      'when popUntilHomeView is called the application should pop the stack until reaching the home screen',
    () {
  // Arrange
  final navigationService = getAndRegisterNavigationServiceMock();
  final viewModel = CurrentViewModel();
  // Act
  viewModel.popUntilHomeView();
  // Assert
  verify(navigationService.popUntil((route) => route.settings.name == 
  '/home-view')).called(1);
  });
});

下面是 NavigationService 中的代码,它基于 FilledStacked Architechure 构建。

void popUntil(RoutePredicate predicate, {int? id}) {
   G.Get.until(predicate, id: id);
}

以下是运行上述测试的结果:

没有匹配的调用。所有调用:MockNavigationService.popUntil(Closure: (Route) => bool, {id: null}) (如果您致电,请改用 。verify(...).called(0);verifyNever(...);

我正在使用 Mockito 来模拟导航服务,这是生成的模拟函数:

 @override
 void popUntil(
 _i8.RoutePredicate? predicate, {
 int? id,
 }) =>
   super.noSuchMethod(
     Invocation.method(
       #popUntil,
       [predicate],
       {#id: id},
      ),
      returnValueForMissingStub: null,
    );

正如你所看到的,该函数被调用了,它只是没有捕获我定义的谓词,而是返回一个 Closure。

问题

有没有人知道如何验证 NavigationService popUntil 是否使用正确的谓词调用?

笔记:

  1. 我尝试存根提供了一些成功的函数,但由于该函数被声明为无效,我无法对返回值做任何事情
  2. 我尝试将谓词声明为“any”,以尝试捕获调用详细信息,但由于谓词不可为空,因此不允许。
Flutter 单元测试 mockito

评论


答: 暂无答案