我们如何验证函数内部的方法是否被调用? 我这里有一个示例代码.

class MockService extends Mock implements Service {}

class MockRepository extends Mock implements Repository {}

class Repository {
  Repository({
    required this.service,
  });
  final Service service;

  Future<void> somethingFancy() async {
    await service.doSomething();
  }
}

class Service {
  Future<void> doSomething() async {}
}

void main() {
  final service = MockService();
  final repository = Repository(service: service);

  group('auth repository test', () {
    test('test name', () async {
      when(repository.somethingFancy).thenAnswer((_) => Future.value());
      await repository.somethingFancy();

      verify(service.doSomething).called(1);
    });
  });
}

如果我运行测试,我会得到这个错误:

type 'Null' is not a subtype of type 'Future<void>'
test/auth_repository_test.dart 20:16      MockService.doSomething
test/auth_repository_test.dart 15:19      Repository.registerUser
package:mocktail/src/mocktail.dart 210:8  when.<fn>
test/auth_repository_test.dart 29:11      main.<fn>.<fn>
===== asynchronous gap ===========================
dart:async                                _completeOnAsyncError
package:mocktail/src/mocktail.dart 210:8  when.<fn>
test/auth_repository_test.dart 29:11      main.<fn>.<fn>

如果我将存储库变量更改为final repository = MockRepository();, 我不能注入Service class,所以服务类内部的方法肯定不会被调用.这就是为什么如果我运行这个测试:

void main() {
  final service = MockService();
  final repository = MockRepository();

  group('auth repository test', () {
    test('test name', () async {
      when(repository.somethingFancy).thenAnswer((_) => Future.value());
      await repository.somethingFancy();

      verify(service.doSomething).called(1);
    });
  });
}

我收到一个错误,显示为no matching calls

No matching calls (actually, no calls at all).
(If you called `verify(...).called(0);`, please instead use `verifyNever(...);`.)
package:test_api                           fail
package:mocktail/src/mocktail.dart 722:7   _VerifyCall._checkWith
package:mocktail/src/mocktail.dart 515:18  _makeVerify.<fn>
test/auth_repository_test.dart 32:13       main.<fn>.<fn>

我到底做错了什么?非常感谢你的帮助.

推荐答案

你在考试中模仿了错误的方法.

你必须嘲笑答案Service#doSomething,而不是Repository#doSimethingFancy.判断一下你的when对帐单.

test('test name', () async {
  when(service.doSomething()).thenAnswer((_) => Future.value());
  await repository.somethingFancy();

  verify(service.doSomething).called(1);
});

Flutter相关问答推荐

如何更新文本字段的基础上的选定下拉菜单?

本机调试符号包含无效的目录调试符号.目前仅支持Android ABI

从超级应用程序启动时,Flutter 小应用程序中未加载资源

悬停时打开Flutter 下拉按钮

如何在Ffltter 3.16中设置标准的提升按钮主题?

在Flutter 小部件测试中找不到框中的AssetImage装饰

将记录/元组用作SplayTreeMap中的键

FittedBox叠加技术在Flutter 中的应用

导航回上一页会将我带回Ffltter应用程序中的登录页面

如何在flutter中使用youtube_explod_start加载下一页

如何在 Flutter 中创建厚度沿着容器逐渐减小的边框

SliverAppbar 呈蓝色

Flutter Firebase 升级后出现问题? ARC 语义问题 (Xcode): Select 器appleCredentialWithIDToken:rawNonce:fullName:没有已知的类方法

如何正确地将 PageView 设置为 AppBar 的标题?

使用 riverpod 提供 GoRouter 实例的正确方法是什么?

如何删除或隐藏覆盖

如何在 Flutter 执行通知时运行后台代码?

Future.wait() 中的 futures 可以顺序调用吗?

如何将 pushNamed 与 Dismissible Widget 一起使用并查看背景透明第一页

Flutter MQTT - 发布到主题 1 并收听主题 2