首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能以编程方式触发ember mirage请求响应

有没有可能以编程方式触发ember mirage请求响应
EN

Stack Overflow用户
提问于 2017-11-30 22:37:26
回答 3查看 100关注 0票数 0

我在测试中使用了Ember mirage。我需要在发送请求之后但在收到响应之前检查被测试组件的状态。

如何配置我的测试,以避免mirage服务器自动响应并以编程方式触发响应?

我曾经使用sinonjs这样做,但是我找不到使用Ember mirage来管理这个用例的方法。有可能吗?

EN

回答 3

Stack Overflow用户

发布于 2017-12-03 10:15:19

http://www.ember-cli-mirage.com/docs/v0.3.x/route-handlers/

您可以在测试中添加如下处理程序:

代码语言:javascript
复制
server.get('/users/:id', function(db, request) {

console.log(request) // to debug request/response

return db.users.find(request.params.id);
});
票数 0
EN

Stack Overflow用户

发布于 2017-12-04 06:26:38

如果我正确理解了您的问题,您正在尝试测试页面上的一种情况(验收测试),此时数据已发送到服务器,但响应仍未到达。

在您的测试中可以访问服务器实例,因此创建自己的方法来暂停/恢复响应并不复杂,但更简单的选项(我也使用)是使用定时选项(http://www.ember-cli-mirage.com/docs/v0.3.x/configuration/#timing)延迟来自幻影的响应。然后,当您在andThen()之前进行测试时,您应该处于希望测试的情况下。

票数 0
EN

Stack Overflow用户

发布于 2020-07-17 14:12:04

您可以访问底层的pretender实例,并且mirage只是将计时参数直接传递给pretender请求。https://github.com/pretenderjs/pretender#timing-parameter

不幸的是,pretender没有用于requestReferencesrequiresManualResolution(verb, path)的文档,但是这个助手函数将处理所有未完成的手动请求

代码语言:javascript
复制
    function resolveManualPretenderRequests(pretender) {
      pretender.requestReferences.forEach((ref) => {
        if (pretender.requiresManualResolution(ref.request.method, ref.request.url)) {
          pretender.resolve(ref.request);
        }
      });
    }

然后,您可以只使用mirage注册一个手动请求处理程序

代码语言:javascript
复制
    server.get('/models:id', { timing: true });

因此,在示例测试中,您可以使用ember测试助手waitFor()来执行以下操作

代码语言:javascript
复制
    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);
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47575982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档