Qunit 中挂起的 Ember 并发超时

2024-07-03

在 Ember 中,我有一个组件可以启动永无止境的轮询,以保持一些数据最新。就像这样:

export default Component.extend({
  pollTask: task(function * () {
    while(true) {
      yield timeout(this.get('pollRate'));
      this.fetchSomeData();
    }
  }).on('init')
})

这会导致预先存在的验收测试陷入此任务并永远运行,即使它应该异步运行。测试看起来像这样:

test('my test', async function(assert) {
  mockFindRecord(make('fetched-model'));

  await visit('/mypage'); // gets stuck here
  await typeIn('input', 'abc123');

  assert.ok(somethingAboutThePage);
});

我一开始以为我错误地模拟了请求,测试只是超时了,但实际上它正确地轮询了数据。删除该任务使验收测试正常完成。

手动测试似乎工作正常,并且没有任何卡住。为什么会发生这种情况以及解决此问题的正确方法是什么?

Saw 对 ember 并发任务和产量进行单元测试 https://stackoverflow.com/questions/58452244/unit-testing-ember-concurrency-tasks-and-yields但它并没有真正的帮助,因为它只处理单元测试。


你没有做错任何事,这是 ember 并发的常见问题。 Ember 并发timeout()函数依赖于Ember.run.later()创建超时,幸运的是或不幸的是,Ember 的测试套件知道使用以下命令创建的所有计时器Ember.run.later()并等待所有计时器稳定后再继续测试。由于您的代码使用无限循环,您的计时器永远不会稳定,因此测试挂起。 Ember 指南中有一个关于测试异步代码的精彩小节here https://guides.emberjs.com/release/testing/testing-components/#toc_waiting-on-asynchronous-behavior.

ember-concurrency 文档中有一个关于这个确切问题的部分here http://ember-concurrency.com/docs/testing-debugging/。我建议你仔细阅读一下他们关于如何解决这个问题的建议,尽管当时似乎没有真正优雅的解决方案。

让它不挂起的最快且可能最简单的方法是检查应用程序是否正在测试(我知道,很糟糕):

pollTask: task(function * () {
    while(true) {
      yield timeout(this.get('pollRate'));
      this.fetchSomeData();
      if (Ember.testing) return; // stop polling to prevent tests from hanging
    }
  }).on('init')

您还可以尝试拨打电话Ember.run.cancelTimers()在你的tests/helpers/start-app.js文件(该部分的另一个建议):

window._breakTimerLoopsId = Ember.run.later(() => {
  Ember.run.cancelTimers();
}, 500);

但它似乎没有出现在 API 文档中,所以我个人不会依赖它。

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

Qunit 中挂起的 Ember 并发超时 的相关文章

  • 数据库锁定在 WAL 模式下,只有读取器

    在中使用System Data Sqlite 1 0 86 0 包括SQLite 3 7 17 预写式记录 http www sqlite org wal html模式下 我在并发读取时遇到数据库锁 如果我正确理解 WAL 则不应该出现这种
  • 并发访问且不受数据结构的影响

    问题是这样的 我有一个包含 500 个指针的数组 它们指向双向链表中的 500 个元素 有 10 个并行运行的线程 每个线程运行 50 个循环 并尝试释放列表中的某些元素 该列表已排序 包含简单整数 并且有 10 个其他线程并行运行 搜索包
  • 在 Haskell 中创建 100 万个线程需要多长时间?

    据我了解 Haskell 有绿色线程 但它们的重量有多轻 是否可以创建100万个线程 或者 100 000 个线程需要多长时间 from here http www reddit com r programming comments a4n
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • ember 错误:编译错误:不是助手

    我在开发前端时遇到以下错误Ember js ember 错误 编译错误 不是助手 这个错误是什么意思 Reason 如果没有 Ember 会抛出此错误成分 or helper在您的项目或依赖的插件中找不到给定名称 怎么解决 您应该检查您编写
  • 如何使嵌入的 hasMany 关系与 ember 数据一起使用

    我无法得到embedded hasMany正确处理 ember 数据 我有这样的东西 App Post DS Model extend comments DS hasMany App Comment App Comment DS Model
  • 单元测试实时/并发软件[重复]

    这个问题在这里已经有答案了 可能的重复 我应该如何对线程代码进行单元测试 https stackoverflow com questions 12159 how should i unit test threaded code 经典的单元测
  • Java 中的原子整数和普通不可变整数类有什么区别?

    由于 Integer 类也是不可变类 并且我们知道不可变类是线程安全的 因此原子整数需要什么 我很困惑 这是否是不可变对象的读取和写入不需要是原子的 而原子整数的读取和写入是原子的原因 这意味着原子类也是线程安全的 当您需要确保只有一个线程
  • 处理请求时使用异步Servlet以及dispatch()和complete()方法的行为

    我正在使用异步 Servlet 来处理请求 根据文件 完全的 https javaee spec java net nonav javadocs javax servlet AsyncContext html complete 28 29
  • 如何避免捕获变量?

    我有问题 foreach var category in categories foreach var word in words var waitCallback new WaitCallback state gt DoSomething
  • 在开发中如何从 https://localhost:4200 提供 ember-cli

    为了使我们的身份验证能够与 ember 应用程序配合使用 我们需要从安全 URL 为该应用程序提供服务 我们有一个自签名的 ssl 证书 如何设置 ember cli 来为 index html 表单提供服务https domain Che
  • Ember Cli Inflector 调整

    我在哪里 如何调整Ember Inflector http emberjs com guides models the rest adapter toc pluralization customization类 创建一个 ember cli
  • Ember.js - 创建多步骤向导 - 如何?

    我需要创建一个包含多个步骤的向导 每个步骤将显示一个带有选项的表单 并且根据用户的选择 向导应该转到某个步骤 并将用户首选项 选择 存储在某个位置 这些首选项不会保存在模型中 它们仅与模型创建步骤相关 为了提供一些背景信息 其目标是 向用户
  • 如果在给出进程 pid 之前向进程发送消息,是否能保证首先收到该消息?

    说有一个过程B 它接收 pid 并发送m2到它 如果你产卵A并发送m1 然后发送A to B is A保证得到m1 before m2 换句话说 这会崩溃吗 module test compile export all test gt B
  • 从组件刷新/重新加载 ember 路由

    我有一个组件 它实际上是一个模式对话框 当我完成该对话框并按 确定 按钮时 我想留在打开该对话框的停留页面上 这并不难 但问题是该对话框更改了数据 我通过 REST 调用获取数据 因此我需要刷新已经所在的路线以反映数据更改 因为我是从组件中
  • Golang通道选择语句

    最近刚刚尝试 go 我想知道如果您有一个 select 语句等待几个通道上的通信 并且如果一条消息同时在两个或多个通道上出现 会发生什么 如果所有消息同时到达 选择将如何确定接受哪个通道 Thanks From the spec http
  • Emberjs Data 稍后如何加载 hasMany-Data

    我有以下 Emberjs 数据模型 App File DS Model extend like DS attr boolean comments DS hasMany App Comment App Comment DS Model ext
  • 我可以在没有 ExecutorService 的情况下使用 Callable 线程吗?

    我可以在没有 ExecutorService 的情况下使用 Callable 线程吗 我们可以在没有 ExecutorService 的情况下使用 Runnable 的实例和 Thread 的子类 并且此代码可以正常工作 但这段代码始终有效
  • 在 ember.js 中定义多分段 catch all 路由

    我正在使用 Ember js 我想创建一个捕获所有路由 以便在用户导航到与资源不匹配的 URL 时将其发送回应用程序的根目录 我正在使用历史API 我已经这样实现了 App Router map function this resource
  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co

随机推荐