Ember验收测试报错:测试模式禁用Run Loop自动运行
解决Ember验收测试中第三方插件触发的Run Loop断言错误
我太懂这种无奈了——自己写的代码都规规矩矩包裹了Run Loop,结果依赖的第三方组件没按Ember测试要求来,直接抛出那个烦人的断言错误。别担心,不用改插件代码,咱们从自己的测试代码和配置入手就能解决:
1. 临时给单个测试启用autorun(应急首选)
测试模式默认禁用了Run Loop的autorun,但咱们可以针对出问题的测试临时打开它,用完再恢复,避免影响其他测试:
import { set } from '@ember/object'; import { test } from 'qunit'; import { visit, andThen } from '@ember/test-helpers'; test('测试第三方组件页面', function(assert) { // 临时开启autorun set(Ember.run, 'autorun', true); visit('/someurl').then(() => { // 你的断言逻辑 assert.ok(find('.third-party-component').length, '组件加载成功'); // 测试结束后立刻恢复默认设置 set(Ember.run, 'autorun', false); }); });
⚠️ 注意:全局开启autorun会让测试的异步控制变弱,可能掩盖你自己代码的潜在问题,所以只在必要的测试里用这个办法。
2. 把整个测试流程包裹进Run Loop
试试把visit、andThen甚至断言逻辑都塞进Ember.run里,强制覆盖第三方组件的异步代码:
import { run } from '@ember/runloop'; import { test } from 'qunit'; import { visit, andThen } from '@ember/test-helpers'; test('测试第三方组件页面', function(assert) { const done = assert.async(); run(() => { visit('/someurl').then(() => { // 这里放你的断言 assert.equal(find('.component-content').text().trim(), '预期内容'); done(); }); }); });
或者简化点,在andThen里嵌套run:
test('测试第三方组件页面', function(assert) { visit('/someurl'); andThen(() => { run(() => { // 执行和组件的交互或断言 assert.ok(true, '组件异步操作已被Run Loop包裹'); }); }); });
3. 自定义测试助手批量处理
如果多个测试都遇到这个问题,可以写个自定义测试助手,自动把操作包裹进Run Loop:
在tests/test-helper.js里添加:
import { run } from '@ember/runloop'; import { registerAsyncHelper } from '@ember/test'; registerAsyncHelper('wrapInRun', function(app, callback) { return run(callback); });
然后在测试里直接用这个助手:
test('测试第三方组件页面', function(assert) { visit('/someurl'); wrapInRun(() => { andThen(() => { assert.ok(find('.component').exists, '组件正常渲染'); }); }); });
4. 升级Ember或测试套件(长期解决方案)
如果项目允许,试试升级到较新的Ember版本(比如3.20+)或者更新@ember/test-helpers。新版本对测试模式下的异步代码处理更智能,很多时候会自动帮你把第三方组件的异步操作包裹进Run Loop,这个错误可能就自动消失了。
内容的提问来源于stack exchange,提问作者Veda
相关产品推荐
相关产品推荐

