Angular 测试中 fakeAsync 和 async 有什么区别?

2024-03-07

我知道tick()函数利用fakeAsync()。我也可以使用fixture.whenStable().then() with async() and fakeAsync()以及。

我想知道它们的确切用例。任何人都可以用例子解释这一点。

注意:我想在这两种情况下使用 Fake Service 或 Stub。


tl;dr

在几乎所有情况下,它们都可以互换使用,但使用fakeAsync()/tick()除非您需要进行 XHR 调用,否则首选组合,在这种情况下您必须使用async()/whenStable()组合,如fakeAsync()不支持XHR调用。


在大多数情况下,它们可以互换使用。我一时想不出其中有什么required除了外部模板和样式未内联编译到组件中进行测试的组件(即使用 SystemJS)之外。使用 SystemJS 时,会对外部模板和样式进行 XHR 调用。fakeAsync()当进行 XHR 调用时无法使用。另一方面,当使用 Webpack 时,外部模板和样式会内联编译,因此您可以使用fakeAsync().

除此之外,我认为这是风格偏好的问题。我可以说的一件事是想象你需要进行多个异步调用,就像这个例子 https://stackoverflow.com/a/39796036/2587435。你需要嵌套fixture.whenStable()调用,当它们变得如此深入时,它可能会开始看起来非常难看。

someAsyncAction();
fixture.whenStable().then(() => {
  fixture.detectChanges();
  expect(something)

  changeSomethingElseAsynchronously();      
  fixture.whenStable().then(() => {
    fixture.detectChanges();
    expect(something);

    anotherAsyncAction();
    fixture.whenStable().then(() => {
      fixture.detectChanges()
      expect(somthingeElse)
    })
  })
})

如果没有所有这些,这可能看起来更干净(并且更容易推理)fixture.whenStable()s 和代码looks同步。

tick();
fixture.detectChanges();
expect(something)

changeSomethingAsynchronously()
tick();
fixture.detectChanges();
expect(somethingElse)

changeSomethingAsynchronously()
tick();
fixture.detectChanges();
expect(somethingElse);

我可能要补充的另一件事是OCD https://en.wikipedia.org/wiki/Obsessive%E2%80%93compulsive_disorder我的一部分always需要检查我的电话是否在fixture.whenStable()叫做

fixture.whenStable().then(() => {
  expect(...)
  console.log('called...')
})

想象一下您忘记将测试包装在async。如果没有这个,测试将在fixture.whenStable决议,你永远不会知道。看起来测试已通过,这是误报。实际发生的情况是,该断言从未被调用过。

出于这个原因,我实际上已经远离async。但如果您喜欢这种风格,并且相信自己,您总是将测试包含在内async,然后坚持下去。但与fakeAsync,所有内容都是同步调用的,因此断言不可能不被调用。

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

Angular 测试中 fakeAsync 和 async 有什么区别? 的相关文章

随机推荐

  • 如何高效并行brms::brm?

    问题总结 我正在装修一个brms brm multiple 模型到一个大型数据集 其中缺失的数据已使用mice包裹 数据集的大小使得并行处理的使用非常可取 但是 我不清楚如何最好地利用计算资源 因为我不清楚如何brms在核心之间划分估算数据
  • 如何在rails中设置“快捷方式图标”? [复制]

    这个问题在这里已经有答案了 我看不到我设置的图像 上面的代码有什么问题 我怎样才能成功运行 See doc http apidock com rails ActionView Helpers AssetTagHelper favicon l
  • 在链接之前或之后放置图标以指示文件类型的最佳做法是什么(例如:链接 Adob​​e PDF、音频或视频)

    我的团队正在讨论在我们网站上的各种媒体文件类型的链接后插入图标的最佳实践是什么 例如 链接到 PDF 并希望插入图标图像以让用户知道它是 PDF 同样的方法也可用于视频或音频文件 我建议使用 CSS 在 上放置一个类并使用 after 创建
  • ggplot 的scale_y_log10 行为

    尝试使用绘制堆积直方图ggplot set seed 1 my df lt data frame param runif 10000 0 1 x runif 10000 0 5 1 my df param range lt cut my d
  • Java Aspect 返回要在方法中使用的值

    我有一个 After运行某些逻辑的java方面 我需要它返回一个结果 一个对象 该结果可以在方面切入点拦截的方法中使用 是否可以 你需要的是 Around它允许您将想要的任何内容返回给建议的对象 Around com xyz myapp U
  • 无法加载 Subversion python 绑定

    这是尝试将 SVN 存储库转换为 Mercurial 存储库的第 2 部分的一部分 命令是 hg convert file c svnrepository 但是 我得到的输出是 assuming destination svnreposit
  • Windows 上的 Jenkins 中的 Git 操作偶尔会挂起

    我们正在运行 Assembla 托管的 Git 项目的连续 Jenkins 构建 Jenkins 在 Tomcat 6 上以自己的用户身份运行 通常工作正常 然而 每隔一段时间 例如每 10 个构建一次 构建作业开始时的签出操作就会挂起 有
  • Ansible回调插件:如何获取其中扩展了变量的任务名称?

    我下面有一个游戏 其中包含一个名称中包含变量的任务 hosts localhost connection local vars a variable test tasks name this is a task to echo a vari
  • Android 的 WebView 中的 shouldOverrideUrlLoading 未运行

    编辑 找到解决方案 经过一番艰苦的搜索后发现了这一点 一个人 我的字面意思是一个人 说他们改为使用 onPageLoad 这非常适合我的目的 不同之处在于 onPageLoad 运行晚于 shouldOverrideUrlLoading 但
  • MassTransit 2.6.1 请求/响应模式 - 响应超时

    我正在将 MassTransit 作为 ServiceBus 实现来在 Web 项目中使用 我正在玩请求 响应 http docs masstransit project com en latest overview request htm
  • 如何在Python中进行多次导入?

    在 Ruby 中 我不是多次重复 require Python 中的 import 这个词 而是 w lib1 lib2 lib3 lib4 lib5 each x require x 因此它会迭代 libs 和 require 导入 的集
  • Zend 框架 2 文件下载

    我制作了一个表单来将文件上传到文件夹 data uploads使用Zend Filter File RenameUpload filter 这就像一个魅力 我现在的问题是如何提供这个文件给用户下载呢 我认为它会是这样的 response g
  • 将多维 NumPy 数组的图像旋转 90 度

    我有一个形状为 7 4 100 100 的 numpy 数组 这意味着我有 7 个 100x100 深度为 4 的图像 我想将这些图像旋转 90 度 我努力了 rotated numpy rot90 array 1 但它将数组的形状更改为
  • 如何将 JTable 中第一行的颜色设置为任何颜色并保留表中之前设置的颜色

    我已经阅读了很多有关 Java 中的 CellRendering 的内容 并且还访问了这个优秀网站的其他问答 不幸的是我仍然没有找到以下问题的解决方案 我想渲染一个显示 StatusEvents 的 JTable 这对于监视正在运行的系统是
  • 使用 load_model 时,keras 内核初始化程序被错误调用

    Keras 版本 2 2 4 张量流版本1 13 1 我正在使用 Colab 笔记本 我正在尝试制作自定义初始值设定项并使用 model save 保存模型 但是当我再次加载模型时 出现以下错误 类型错误 myInit 缺少 1 个必需的位
  • 是否可以在运行时更改 Qt 上的语言

    在我的应用程序中 我需要国际化 假设我为不同语言创建了多个 ts 文件 例如 德语 法语等 以及翻译的短语 现在 假设用户想要在运行时更改语言 使用Qt方法是不可能的吗 Qt 5 10 中引入的函数 QQmlEngine retransla
  • Rust 泛型中的常量值[重复]

    这个问题在这里已经有答案了 Rust 语言是否支持类似于 C 方式的通用代码中的常量值 看来语言overview http static rust lang org doc tutorial html generics不做广告 在 C 中使
  • 非管理员的图形 API 权限

    我想向非管理员用户 Bob 授予一些 Graph API 权限 以便它能够读取一些数据without需要管理员同意 If I give the admin consent here every permission is given to
  • 传递到字典中的模型项的类型为“System.Collections.Generic.List”

    我是 ASP NET 新手 这是我的第一个应用程序 我正在开发一个管理保险请求的应用程序 模型请求包含文件上传 addDemand 添加请求 需要成员 遵守者 登录 每次我尝试运行 addDemande 时都会收到错误 传递到字典中的模型项
  • Angular 测试中 fakeAsync 和 async 有什么区别?

    我知道tick 函数利用fakeAsync 我也可以使用fixture whenStable then with async and fakeAsync 以及 我想知道它们的确切用例 任何人都可以用例子解释这一点 注意 我想在这两种情况下使