1

我正在使用 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中特定响应的延迟?

4

2 回答 2

4

一些想法:

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

    test('for slow behavior', function() {
      server.timing = 400;
      //
    });
    
  • 您还可以在测试中重新定义路由处理程序,如验收测试指南的第二个示例中所示。如果您正在使用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。

于 2016-03-05T12:35:06.577 回答
0

我们必须<progress>使用 mirage 测试我们的元素是否显示在测试中,并发现使render方法同步和搭载waitFor并且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');
});
于 2021-05-17T20:26:50.743 回答