Как я высмеиваю (request-обещание) .defaults ({jar: true}), используя Jest? - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь написать тест, который использует фиктивную реализацию запроса-обещания с установленными значениями по умолчанию.

В моем коде мне требуется запрос с использованием const request = require('request-promise').defaults({ jar: true });

в моем тестовом файле , Я попытался

const request = require('request-promise');

jest.mock('request-promise');
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

// This returns the error 'TypeError: request is not a function'
const request = require('request-promise').defaults({ jar: true });

jest.mock('request-promise');
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

// This returns the error 'TypeError: Cannot read property 'mockImplementation' of undefined'
const request = require('request-promise').defaults({ jar: true });

jest.mock('request-promise').defaults({ jar: true });
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

// This returns the error 'TypeError: jest.mock(...).defaults is not a function'
const request = require('request-promise').defaults({ jar: true });

jest.mock(('request-promise').defaults({ jar: true }));
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

// This returns the error 'TypeError: "request-promise".defaults is not a function'

Моя функция выглядит как

const request = require('request-promise').defaults({ jar: true });

const getData = async function getData(
  previousRequestResponse,
  uniqueId,
) {

  // Below function carries out some manipulation of previous response
  const body = await getRequestBody(previousRequestResponse);

  const response = await request(method, url, body, headers)
    .then(response => JSON.parse(response.body))
    .catch((err) => {
      Logger.error('Failed');
      Logger.error(`ERROR - ${err.message}`);
      throw err;
    });

  const newResponse = manipulate(response);

  return newResponse;
};

Я хочу смоделировать запрос, так что ответ является заглушенным значением, и я может утверждать, что в конце функции возвращается правильное значение.

1 Ответ

0 голосов
/ 19 апреля 2020

Если вы хотите издеваться над модулем request-promise, вы можете сделать это, используя метод jest.mock и предоставив параметр factory.

Если вы должны были протестировать свой getData метод, вы можете создать фабрику, которая выглядит следующим образом:

jest.mock('request-promise', () => {
    const mock = {
        __esModule: true,
        default: (method, url, body, headers) => Promise.resolve({
            body: JSON.stringify([])
        }),
        defaults: () => mock.default
    };

    return mock;
});

С этим кодом ваши вызовы request всегда будут возвращать объект со свойством body, которое содержит пустой массив (в виде строки так что вызов JSON.parse в методе getData может его проанализировать).

Приложение: Почему попытки, которые вы пытались сделать до сих пор, не увенчались успехом

Попытка 1

const request = require('request-promise');

jest.mock('request-promise');
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

Здесь вы вызываете jest.mock на модуле без заводских параметров. Таким образом, jest автоматически смоделирует все методы модуля, и они будут возвращать undefined при вызове. Следовательно, когда в вашем коде вы импортируете модуль и вызываете метод defaults:

const request = require('request-promise').defaults({ jar: true });

, переменная request приводит к undefined. Позже, когда вы вызываете метод request, он выдает:

'Ошибка типа: запрос не является функцией'

Попытка 2

const request = require('request-promise').defaults({ jar: true });

jest.mock('request-promise');
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

Здесь применяется тот же лог c предыдущей попытки. Переменная request будет undefined, и при попытке вызвать метод mockImplementation она выдает:

'TypeError: Невозможно прочитать свойство' mockImplementation 'из неопределенного'

Попытка 3

const request = require('request-promise').defaults({ jar: true });

jest.mock('request-promise').defaults({ jar: true });
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

Здесь вы вызываете метод defaults для возвращаемого значения вызова jest.mock. Поскольку вызов jest.mock не возвращает вашу ложную версию модуля request-promise, он не содержит метод defaults. Поэтому, когда вы вызываете этот метод, он выдает:

'TypeError: jest.mock (...). Defaults не является функцией'

Попытка 4

const request = require('request-promise').defaults({ jar: true });

jest.mock(('request-promise').defaults({ jar: true }));
request.mockImplementation(() => Promise.resolve(JSON.stringify(someVar)));

В этой попытке вы пытаетесь вызвать метод defaults из строки request-promise. Строки не имеют такого метода, поэтому вызов его вызывает:

'TypeError: "request-обещание" .defaults не является функцией "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...