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

Posted

技术标签:

【中文标题】在 ember-cli-mirage 中引入瞬时延迟【英文标题】:Introduce momentary delays in ember-cli-mirage 【发布时间】:2016-03-05 09:22:13 【问题描述】:

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

【问题讨论】:

【参考方案1】:

一些想法:

您可以通过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。

【讨论】:

嗯,它有效,但我不确定它是否真的有用。由于运行循环的连接方式,当应用程序等待响应时,我无法测试在那个过渡期间发生了什么:-/当然我对运行循环的理解不足,所以我可能错过了什么? 您的应用程序中的什么代码发出了网络请求?路由处理程序上的模型挂钩? 不,它在控制器中。这是一个搜索查询,搜索词是从查询参数映射的。 @SamSelikoff,我试图在测试环境中模拟网络节流,但由于异步助手,我无法做到这一点。步骤:1)将 ec-mirage 中的服务器计时设置为 1000 毫秒 2)触发一个动作 3)再次将 ec-mirage 中的服务器计时设置为 0 毫秒 4)触发相同的动作 5)实际上使用了async wait(),第二个调用应该首先解决.但它不是因为后来的服务器时间覆盖了配置。无论如何,我可以测试这个案例吗?那不是模型钩子!【参考方案2】:

我们必须测试我们的 <progress> 元素是否显示在使用 mirage 的测试中,并发现使 render 方法同步并捎带 waitForsettled 效果最好(并且不需要设置 @ 987654328@):

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');
);

【讨论】:

以上是关于在 ember-cli-mirage 中引入瞬时延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ember-cli-mirage 中创建对象?

使用 ember-cli-mirage 测试错误响应

ember-cli-mirage 和 babel 错误

Ember.js - 将 ember-cli-mirage 用于假模型时未找到模型

当模型被侧载时,ember-cli-mirage 失去关系

动态演示频域采样与时域周期延拓现象