引入ember-cli-mirage的瞬间延迟

时间:2016-03-05 09:22:14

标签: ember.js ember-testing ember-cli-mirage

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

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

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

我尝试过的其他事情就是在假端点返回一个承诺。通过一些导入/导出,我可以控制我的测试中的承诺的解决方案。不幸的是,ember-cli-mirage似乎并没有将返回值视为一个承诺,只是简单地将其传递回适配器:

// 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中特定响应的延迟?

2 个答案:

答案 0 :(得分:3)

一些想法:

  • 您可以通过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();
    });
    

我认为你有能力返回一些你可以控制冻结的东西,这是测试它的理想方式,与Timecop类似。也许Mirage最终可以为此添加API。

答案 1 :(得分:0)

我们必须使用 Mirage 测试我们的 <progress> 元素是否显示在测试中,并发现使 render 方法同步并搭载 waitForsettled 效果最佳(并且根本不需要设置 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');
});