我在测试中使用了Ember mirage。我需要在发送请求之后但在收到响应之前检查被测试组件的状态。
如何配置我的测试,以避免mirage服务器自动响应并以编程方式触发响应?
我曾经使用sinonjs这样做,但是我找不到使用Ember mirage来管理这个用例的方法。有可能吗?
发布于 2017-12-03 10:15:19
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);
});发布于 2017-12-04 06:26:38
如果我正确理解了您的问题,您正在尝试测试页面上的一种情况(验收测试),此时数据已发送到服务器,但响应仍未到达。
在您的测试中可以访问服务器实例,因此创建自己的方法来暂停/恢复响应并不复杂,但更简单的选项(我也使用)是使用定时选项(http://www.ember-cli-mirage.com/docs/v0.3.x/configuration/#timing)延迟来自幻影的响应。然后,当您在andThen()之前进行测试时,您应该处于希望测试的情况下。
发布于 2020-07-17 14:12:04
您可以访问底层的pretender实例,并且mirage只是将计时参数直接传递给pretender请求。https://github.com/pretenderjs/pretender#timing-parameter
不幸的是,pretender没有用于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 });因此,在示例测试中,您可以使用ember测试助手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);
});https://stackoverflow.com/questions/47575982
复制相似问题