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

Posted

技术标签:

【中文标题】Ember mirage 仅在特定情况下引入延迟【英文标题】:Ember mirage introduce delay in specific cases only 【发布时间】:2018-01-18 22:22:38 【问题描述】:

为了在我的前端测试一些超时情况,我想在 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 (..)

    
  
  

在这篇文章中,Introduce momentary delays in ember-cli-mirage Sam 建议使用 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 设置,以便我可以设置 定时(延迟)配置仅适用于某些情况,而其他情况则保持正常。

【问题讨论】:

【参考方案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
 

【讨论】:

感谢山姆的建议。但是我遇到了其他问题-我不知道如何正确安装此 sessionRouteHandler 模块。我不断收到未捕获的错误:找不到从 app-name/mirage/config 导入的模块 app-name/mirage/route-handlers/custProfileRouteHandler 我什至尝试在 ember-cli-build.js 中导入,但是当我执行此操作时似乎无法正确找到路径 app.import('route-handlers/custProfileRouteHandler.js‌​');或 app.import(app-name/mirage/route-handlers/custProfileRouteHandler.js‌​');我不断收到错误,例如 Broccoli Plugin: [BroccoliMergeTrees: TreeMerger (otherAssetTrees)] failed with: Error: ENOENT: no such file or directory, scandir /app-path/app-name/tmp/funnel-input_base_path-FKJDF7bj.tmp /路由处理程序/ 现在我已经采用了您提到的解决方案,其中不包括创建 sessionRouteHandler。不理想,但可以完成工作。我的模块没有收到我的 Ember - 这是一个单独的问题,可以在单独的帖子中处理。感谢您的帮助山姆

以上是关于Ember mirage 仅在特定情况下引入延迟的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器中运行测试时禁用 Ember Mirage

Ember Mirage 没有将模型作为 ember 对象传递

Ember 数据模型中的计算属性不适用于 ember-cli-mirage 模型

Ember + Mirage:响应模拟错误

Ember.js - 将 ember-cli-mirage 用于假模型时未找到模型

Ember Mirage - 无法捕获响应