Ember海市蜃楼仅在特定情况下引入延迟

时间:2018-01-18 22:22:39

标签: ember.js ember-cli-mirage

为了在我的前端测试一些Timeout案例,我想在海市蜃楼中引入人为延迟,同时只响应某些特定请求,并立即响应所有其他情况。

我正在写这样的幻影场景

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 (..){

    }
  }
}  

在这篇文章中,Introduce momentary delays in ember-cli-mirage Sam建议使用{timing:400};与调用,在我的示例中使用时看起来像以下。

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};
} 

这基本上会导致所有到达此端点的测试用例的调用延迟 - 为我的目的服务。

有没有我可以重构我的幻影设置,以便我可以设置 时间(延迟)配置仅适用于某些情况,并使所有其他情况正常。

1 个答案:

答案 0 :(得分:1)

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

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
}