我在测试中使用了Ember海市蜃楼。我需要在发送请求之后但在收到响应之前检查我测试组件的状态。
如何配置我的测试以避免海市蜃楼服务器自动响应并以编程方式触发响应?
我曾经和sinonjs这样做,但我找不到用Ember海市蜃楼管理这个用例的方法。有可能吗?
答案 0 :(得分:0)
http://www.ember-cli-mirage.com/docs/v0.3.x/route-handlers/
您可以在测试中添加这样的处理程序:
server.get('/users/:id', function(db, request) {
console.log(request) // to debug request/response
return db.users.find(request.params.id);
});
答案 1 :(得分:0)
如果我正确理解了您的问题,那么当您将数据发送到服务器但响应仍未到达时,您正试图测试页面上的情况(验收测试)。
可以在测试中访问 server 实例,因此创建自己的暂停/恢复响应的方法并不复杂,但更简单的选项(我也使用)是只是为了使用计时选项(http://www.ember-cli-mirage.com/docs/v0.3.x/configuration/#timing)推迟海市蜃楼的回应。然后,当您在 andThen()之前进行测试时,您应该处于您希望测试的状态。
答案 2 :(得分:0)
您可以访问底层的伪装实例,而Mirage只是将计时参数直接传递给伪装请求。 https://github.com/pretenderjs/pretender#timing-parameter
不幸的是,伪装者没有requestReferences
和requiresManualResolution(verb, path)
的文档,但是此助手功能将处理所有未完成的手动请求
function resolveManualPretenderRequests(pretender) {
pretender.requestReferences.forEach((ref) => {
if (pretender.requiresManualResolution(ref.request.method, ref.request.url)) {
pretender.resolve(ref.request);
}
});
}
然后,您可以使用Mirage注册一个手动请求处理程序
server.get('/models:id', { timing: true });
因此在示例测试中,您可以使用余烬测试助手waitFor()进行类似的操作
test('button is disabled while loading', async function(assert) {
assert.expect(2);
// passing true to timing tells the underlying pretender handler wait for the request to be manually processed
server.get('/models/:id', { timing: true });
// await render will wait for promises to settle, but we actually don't want that
const renderPromise = render(hbs`<MyComponent />`);
// the waitFor() helper instead will allow us to just wait for our button to render
await waitFor('button');
const button = this.element.querySelector('button');
// since the request has not resolved yet, the button is disabled
assert.strictEqual(button.disabled, true);
// then we manually resolve the request
resolveManualPretenderRequests(server.pretender);
// now we can await the render so that we get our updated button state
await renderPromise;
// with the request resolved, now the button is no longer disabled
assert.strictEqual(button.disabled, false);
});