我正在使用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中特定响应的延迟?
答案 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
方法同步并搭载 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');
});