ember.js 是否可以通过编程方式触发ember mirage请求响应

gkn4icbw  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(163)

我在我的测试中使用Ember Mirage。我需要在发送请求之后但在收到响应之前检查我的测试组件的状态。
如何配置我的测试以避免mirage服务器自动响应并以编程方式触发响应?
我曾经用sinonjs这样做,但我没有找到用Ember mirage管理这个用例的方法。这是可能的吗?

ozxc1zmp

ozxc1zmp1#

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);
});
1l5u6lss

1l5u6lss2#

如果我没理解错的话,您是在尝试测试页面上的一种情况(接受测试),即数据已发送到服务器,但响应仍然没有到达。
可以在测试中访问 server 示例,因此创建自己的方法来暂停/恢复响应并不复杂,但更简单的选项(我也使用)是使用 timing 选项(http://www.ember-cli-mirage.com/docs/v0.3.x/configuration/#timing)延迟来自mirage的响应。然后,当您在 andThen() 之前进行测试时,您应该处于希望测试的情况下。

qc6wkl3g

qc6wkl3g3#

您可以访问底层的伪装者示例,并且事实上Mirage只是将timing参数直接传递给伪装者请求。https://github.com/pretenderjs/pretender#timing-parameter
不幸的是,pretender没有requestReferencesrequiresManualResolution(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);
    });

相关问题