【问题标题】:How to add extension function to nock.Scope如何向 nock.Scope 添加扩展功能
【发布时间】:2019-10-07 18:16:18
【问题描述】:

我在 angular/typescript 服务器端应用程序的单元测试中使用 nock。我有一组经常发出的复杂请求,我想将同一组 nock 请求重新用于多个单元测试。我想向 nock.Scope 添加函数,让我可以像这样设置单元测试:

const req = nock('http://some-base-server.com/')
  .mockPermissions(param1, param2)
  .get('/unique-request-for-unit-test')
  .reply(200, {data: true});

我试过像这样创建一个 testHelper.ts 文件:

import nock from 'nock';

module 'nock' {
  class Scope {
    mockPermissions(param1: string, param2: string): Scope;
  }
}

nock.Scope.prototype.mockPermissions = function(param1: string, param2: string) {
  return this
    .get('/permission')
    .reply(200, { permission: data })
    .get('/group')
    .reply(200, { group: data });
};

虽然我的示例尝试编译正常,但在运行时它基本上说 nock.Scope 找不到。

我该怎么做?

【问题讨论】:

    标签: javascript node.js nock


    【解决方案1】:

    这对您不起作用,因为Scope 仅作为类型从库中导出,作为值的类不会公开。 你可以看到导出了哪些值here in the index file。

    我个人也建议总体上反对这种方法。修改您无法完全控制的对象的原型往往会被视为代码异味,因为它可能会导致未来出现意外问题。

    当我以前站在你的立场上时,我已经走上了创建预先构建 nocks 的辅助函数的路线。我通常将它们与创建其他工厂的相同测试助手放在一起。

    对于您的代码,例如,我会创建如下内容:

    export function nockAuthForBaseService(param1: string, param2: string) {
      return nock('http://some-base-server.com/')
        .get('/permission')
        .reply(200, { permission: param1 })
        .get('/group')
        .reply(200, { group: param2 });
    }
    

    然后我可以从各种测试中调用并重用这个工厂来干燥它们。

    是否传递现有的 nock 实例完全取决于您。我从来没有遇到过这样的场景,即我想要锁定的拦截器在服务中被重用,因此让我的代码更好地让助手知道基本 URL。对于不需要的测试,只需少一点开销。

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多