在 ember-cli-mirage 中引入瞬时延迟

Introduce momentary delays in ember-cli-mirage

我正在使用 ember-cli-mirage 进行验收测试。对于特定情况,我想检查通过慢速连接获取数据时的行为。

ember-cli-mirage 中有一个名为 timing 的设置可以模拟响应延迟。但是,此设置不能在特定测试中更改为不同:

// app/mirage/config.js
this.timing = 400;

我尝试过的其他方法是 return在假端点承诺。通过一些 import/export,我可以控制测试中承诺的分辨率。不幸的是,ember-cli-mirage 似乎没有将 return 值识别为承诺,只是将其逐字传递回适配器:

// app/mirage/config.js
this.get('/StopPoint/Search/:term', (db, request) => {
  return freezer.run(function() {
    return db[`stop-point-search-${request.params.term}`][0];
  });
});

// At my test
freezer.on()
runTests()
freezer.off()

问题:请问有什么办法吗?即:控制ember-cli-mirage?

中特定响应的延迟

一些想法:

  • 您可以通过 server.timing 更改特定测试中的计时。应该为每个测试重新实例化服务器,这样就不会影响其他测试。

    test('for slow behavior', function() {
      server.timing = 400;
      //
    });
    
  • 您还可以在测试中重新定义路由处理程序,如 the second example of the Acceptance testing guides 所示。如果您使用 0.2.0-beta,路由处理程序有一个 timing 选项,您可以使用它来影响该处理程序:

    test('for slow behavior', function() {
      server.get('/slow-query', (schema, request) => {
        //
        return data;
      }, {timing: 400};
    
      visit('/');
      //
      assert();
    });
    

我认为你的直觉 return 你可以控制冻结的东西是测试这个的理想方法,与 Timecop 等东西一起使用。也许 Mirage 最终可以为此添加一个 API。

我们必须测试我们的 <progress> 元素在使用 mirage 的测试中显示,并发现使 render method syncronous and piggybacking off of waitFor and settled 效果最好(并且根本不需要设置 this.server.timing) :

const SELECTORS = {
    LOADING_SPINNER: '[role="progressbar"]'
};

test('it displays loading spinner when fetching blog post', async function(assert) {
    this.blogId = 1;
    render(hbs`<BlogPost @blogId={{this.blogId}}/>`); // NOTE: no await
    await waitFor(SELECTORS.LOADING_SPINNER);
    assert.dom(SELECTORS.LOADING_SPINNER).exists({ count: 1 }, 'loading spinner rendered while blog post loads');
    await settled();
    assert.dom(SELECTORS.LOADING_SPINNER).doesNotExist('loading spinner removed when blog post loaded');
});