【问题标题】:Ember mirage introduce delay in specific cases onlyEmber mirage 仅在特定情况下引入延迟
【发布时间】: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 设置,以便我可以设置 定时(延迟)配置仅适用于某些情况,而其他情况则保持正常。

【问题讨论】:

    标签: ember.js ember-cli-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 - 这是一个单独的问题,可以在单独的帖子中处理。感谢您的帮助山姆
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2019-10-26
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多