有什么办法可以运行 ember 慢速模式验收测试用例吗?

Is there any way to run ember acceptance test case in slow mode?

我写了一些 ember 验收测试用例。问题是当我通过 Acceptance 访问 URL http://localhost:4200/tests 和过滤器模块时,测试用例是 运行ning 快如闪电。尽管这些是在 async await 函数中编写的。

我想使用 ember 运行 循环 run.laterrun.next 为每行设置一个时间延迟。但这不是解决方案。

有没有办法在应用程序顶部的某处添加 slow mode(或者)是否有任何已经存在的测试助手?所以我可以看到测试用例 运行ning 正在运行。

Ember 测试没有 "slow mode",但您可以使用常规 JavaScript 方法自行降低测试速度。例如,下面我们创建了一个 wait 方法,您可以在测试的每个步骤之间调用它。

此问题已在 episode of May I Ask a Question 上发表!您可以观看录像,了解如何使用下面的代码以及如何使用调试器和 pauseTest.

的示例

此代码将等待一秒钟,然后移至下一行,无论您放置 await wait():

import { module, test } from 'qunit';
import { visit, currentURL } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import { click, find } from '@ember/test-helpers';

function wait(timeout = 1000) {
  return new Promise((resolve) => {
    setTimeout(resolve, timeout);
  });
}

module('Acceptance | slowdown', function(hooks) {
  setupApplicationTest(hooks);

  test('clicking the button reveals text', async function(assert) {
    await visit('/');
    await wait();
    await click('.test-button-1');
    await wait();
    assert.equal(find('.some-message').innerText, 'first message');
    await click('.test-button-2');
    await wait();
    assert.equal(find('.some-message').innerText, 'second message');
  });
});

我还建议使用浏览器的调试器按照您自己的步调逐步执行代码。它真的很强大,在大多数情况下,它可能对您的帮助不仅仅是减慢测试速度。 this.pauseTest() 也很有帮助。

还有可能使用 JavaScript 生成器来生成一些不那么混乱的代码,但如果你使用它,你的测试将无法正常退出,所以这是一个临时方法:

import { module, test } from 'qunit';
import { visit, currentURL } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import { click, find } from '@ember/test-helpers';

function slowTest(message, generatorFunction) {
  test(message, async function(assert) {
    let generator = generatorFunction(assert);

    window.step = window.next = async () => {
      generator.next();
      await this.pauseTest();
    }

    window.finish = () => {
      generator.return();
      this.resumeTest();
    }

    await this.pauseTest();
  });

}

module('Acceptance | slowdown', function(hooks) {
  setupApplicationTest(hooks);

  slowTest('clicking the button reveals text', function*(assert) {
    yield visit('/');
    yield click('.test-button-1');

    assert.equal(find('.some-message').innerText, 'first message');

    yield click('.test-button-2');

    assert.equal(find('.some-message').innerText, 'second message');
  });
});