使用mocktail包进行单元测试时,类型“Null”不是类型“Future”的子类型

2024-02-27

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

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);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用mocktail包进行单元测试时,类型“Null”不是类型“Future”的子类型 的相关文章

随机推荐

  • 将日期中的月份日期更改为第一天 (01)

    我想将月份中的某一天设置为Date到当月的开始日期 01 现在我使用以下内容 currentDate lt Sys Date for getting current system date eg 2012 11 06 formatDate
  • 如何提取 OLE 容器的内容?

    我需要打开 MS Word 文件 doc 并提取其组成文件 1 CompObj WordDocument 等 像 7 zip 这样的东西可以用来手动执行此操作 但我需要以编程方式执行此操作 我发现 Word 文档是一个 OLE 容器 因此可
  • Java对象分配开销

    我正在用 Java 编写一个不可变的 DOM 树 以简化多线程的访问 然而 它确实需要尽可能快地支持插入和更新 由于它是不可变的 如果我对树的第 N 层上的节点进行更改 我需要分配至少 N 个新节点才能返回新树 我的问题是 预先分配节点而不
  • 数据框能做什么而 tibble 不能做什么?

    Tidyverse 的粉丝经常给出使用 tibbles 而不是数据帧的几个优点 其中大多数似乎都是为了保护用户免于犯错误而设计的 例如 与数据帧不同 tibbles 不需要一个 drop FALSE不从数据中删除维度的论点 不会让 运算符对
  • 如何在点击推送通知时打开Fragment

    我的 Firebasemessagingservice 类代码用于传递意图 private void showNotification String message Intent intent new Intent this DrawerA
  • 您使用哪种布局管理器?

    大家都用什么java GUI布局管理器 最近 我一直在使用米格布局 http www miglayout com 其中有一些强大的组件控件 只是想看看其他开发人员除了标准 JDK 之外还使用什么 米格布局 http www miglayou
  • 在 CollapsingToolbarLayout 中以编程方式更改layout_scrollFlags

    我的 xml 中有以下 CollapsingToolbarLayout 标记
  • C# 类的属性包

    访问 C 类属性 如 JavaScript 语言 将使生活变得更加轻松 我们如何在 C 中做到这一点 例如 someObject Property simple string Console WriteLine someObject Fir
  • 比较 Oracle 中的字符串

    我需要在表中查询给定字符串的值 该表区分大小写 但我想在比较中执行 ToLower 假设我有一个包含以下数据的类表 class teacher Mat101 Smith MAT101 Jones mat101 Abram ENG102 Sm
  • Perl 中 grep 的“no autovivication”编译指示失败

    我正在尝试使用该模块关闭自动激活 https metacpan org pod autovivification https metacpan org pod autovivification但 grep 失败 usr bin env pe
  • 定时器内存泄漏

    我正在使用一个在侦听器事件上取消并重新启动的计时器 除了计时器线程泄漏整个外部类之外 一切都工作正常 我的定时器实现如下 if timer null timer cancel timer null timer new Timer timer
  • Haskell:输入“putStrLn”时解析错误

    我刚刚编写了我的第一个 Haskell 程序 但有一个我无法理解的错误 我认为这是对的 因为我只是像书上的例子一样写的 有人可以帮我吗 main do putStrLn Hello what s your name name lt getL
  • 有趣的正则表达式 - 匹配字符数等于 2^n 的单词

    嘿 我一直在寻找有关正则表达式的反思主题 我想要一个正则表达式来匹配单词列表中包含 2 n 个字符的每个单词 其中 n 是自然数 为了简单起见 我们假设一个单词只是一个序列o我们还假设该列表由单词组成 后跟单词所包含的字符数 并用空格分隔当
  • Swift 3:单例的属性观察器

    我想知道是否有任何方法可以观察单例类的某个属性的变化 就我而言 对于 Realm 我有这样的东西 class User Object dynamic var name String dynamic var email String dyna
  • iOS8 照片框架:如何获取 PHAsset 的名称(或文件名)?

    我试图使用获取图像名称PHAssets 但我找不到文件名的元数据或任何获取图像名称的方法 有其他方法获取文件名吗 我知道这个问题已经得到解答 但我想我会提供另一种选择 extension PHAsset var originalFilena
  • 在视图中使用临时表

    我真的很想创建一个视图 我知道您不能在 MSSQL2005 视图中使用临时表 在不重写 sql 的情况下 我是否遗漏了任何明显的东西 备份计划是使用存储过程 Cheers select into temp from vwIncidents
  • 如何在Java中为Android设置HttpResponse超时

    我创建了以下函数来检查连接状态 private void checkConnectionStatus HttpClient httpClient new DefaultHttpClient try String url http xxx x
  • Jupyter 笔记本自动完成显示重复选项

    Jupyter notebook s autocomplete seems working but somehow it will show duplicate options for the method For example belo
  • 通过 CORS 使用 Ajax 请求在浏览器上设置 Cookie

    尝试实现 ajax 登录 注册过程 没有带有身份验证的刷新站点 使用 cookie 来保存状态 我以为我现在就可以了 但由于某种原因 浏览器在从服务器取回 cookie 后不会设置 cookie 有人可以帮忙吗 以下是请求和响应标头 Req
  • 使用mocktail包进行单元测试时,类型“Null”不是类型“Future”的子类型

    我们如何验证函数内的方法是否被调用 我这里有一个示例代码 class MockService extends Mock implements Service class MockRepository extends Mock impleme