Ember mirage 仅在特定情况下引入延迟

Ember mirage introduce delay in specific cases only

为了在我的前端测试一些超时情况,我想在 mirage 中引入人为延迟,同时仅响应某些特定请求并立即响应所有其他情况。

我正在写这样的幻影场景

export default function () {
    this.post('/ebm-anp/api/v1/json/sessions', (schema, request) => {
  const req = JSON.parse(request.requestBody);
    if ((req.card.value === '12345678' || req.card.value === '12345678-encrypted-value') && req.password === 'abc') {
            return new Response(200, {'X-Auth-Token': '2704412f-7820-4431-86c1-1234567800'}, successResponse);
    }else if (..){

    }
  }
}  

在此post、 山姆建议使用 {timing: 400};使用 call ,在我的示例中使用时如下所示。

export default function () {
    this.post('/ebm-anp/api/v1/json/sessions', (schema, request) => {
  const req = JSON.parse(request.requestBody);
    if ((req.card.value === '12345678' || req.card.value === '12345678-encrypted-value') && req.password === 'abc') {
            return new Response(200, {'X-Auth-Token': '2704412f-7820-4431-86c1-1234567800'}, successResponse);
    }else if (..){

    }
  },{timing: 400};
} 

这基本上引入了所有到达此端点的测试用例的调用延迟 - 满足我的目的。

有什么方法可以重构我的 Mirage 设置,以便我可以设置 时序(延迟)配置仅适用于某些情况,而对所有其他情况保持正常。

如果您只想在 单个测试 中引入延迟,您始终可以在测试中覆盖路由处理程序,包括传递计时选项:

test('I see a loading spinner when the sessions endpoint is slow', function(assert) {
  server.post('/ebm-anp/api/v1/json/sessions', (schema, request) => {
    const req = JSON.parse(request.requestBody);
    if ((req.card.value === '12345678' || req.card.value === '12345678-encrypted-value') && req.password === 'abc') {
      return new Response(200, {'X-Auth-Token': '2704412f-7820-4431-86c1-1234567800'}, successResponse);
    } else if (..) {
      //
    }
  }, { timing: 400 });

  visit('/');
  // do more things
} 

基本上,您只是为了这个测试覆盖了这条特定的路线。 config 中的路线将在每次新测试运行时重新加载,因此该路线的时间将被重置。

如果你想共享路由处理程序,这样你就不必在两个地方重新定义整个东西,只需将它放在一个合理的文件中

// mirage/route-handlers/sessions.js
export default (schema, request) => {
  const req = JSON.parse(request.requestBody);
  if ((req.card.value === '12345678' || req.card.value === '12345678-encrypted-value') && req.password === 'abc') {
    return new Response(200, {'X-Auth-Token': '2704412f-7820-4431-86c1-1234567800'}, successResponse);
  } else if (..) {
    //
  }
});

然后像

一样导入它
import sessionsRouteHandler from 'my-app/mirage/route-handlers/sessions';

并像

一样使用它
// mirage/config.js
this.post('/ebm-anp/api/v1/json/session', sessionsRouteHandler);

// your-test.js
test('I see a loading spinner when the sessions endpoint is slow', function(assert) {
  session
  server.post('/ebm-anp/api/v1/json/sessions', sessionsRouteHandler, { timing: 400 });

  visit('/');
  // do more things
}