Как добавить функцию расширения в nock.Scope - PullRequest
0 голосов
/ 07 октября 2019

Я использую nock в модульных тестах серверного приложения на языке angular / typcript. У меня сложный набор запросов, который часто делается, и я хотел бы повторно использовать один и тот же набор запросов 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 не может быть найден.

Как я могу это сделать?

1 Ответ

0 голосов
/ 07 октября 2019

Это не сработает, потому что Scope экспортируется только как тип из библиотеки, а класс как значение не публикуется. Вы можете увидеть, какие значения экспортируются здесь, в индексном файле .

Я также лично рекомендовал бы против такого подхода в целом. Изменение прототипа объекта, который вы не полностью контролируете, обычно считается запахом кода, поскольку это может привести к неожиданным проблемам в будущем.

Когда я уже был на вашем месте, япошли по пути создания вспомогательных функций, которые предварительно строят 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. Просто на один кусок накладных расходов на тесты не нужно.

...