Если вы хотите издеваться над модулем 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 не является функцией "