Если вы получаете TypeError: request is not a function
, то, вероятно, esModuleInterop
установлен в true
в вашей конфигурации TypeScript.
Если это так, вам нужно импортировать request
следующим образом:
import request from 'request';
Модули TypeScript и ES6 отличаются от старого стиля модуля, а флаг esModuleInterop
указывает TypeScript выполнить некоторую дополнительную работу, чтобы скомпилировать операторы import
старых модулей для работы, как если бы они былиболее новый стиль ... в этом случае обработка экспорта одной функции выполняется так, как если бы это был экспорт default
модуля TypeScript / ES6.
jest.mock
не работает внутриtest , поэтому вам нужно переместить его за пределы теста.
Если вы передаете фабричную функцию в качестве второго параметра, тогда она должна быть полностью автономной, так как вызов jest.mock
получаетПоднимается и будет запускаться раньше всего в тестовом файле.
В этом случае вы можете заставить свой макет возвращать один и тот же объект каждый раз, чтобы вы могли получить макет во время теста и проверить, что он был вызван как expected:
import request from 'request';
import {Request} from 'jest-express/lib/request';
import {Response} from 'jest-express/lib/response';
import ProxyClass from './Proxy';
jest.mock('request', () => {
const mockRequest = {
pipe: jest.fn(),
on: jest.fn(),
}
return function() {
return mockRequest; // <= returns the same object every time...
}
});
describe('proxy request', () => {
const req: any = new Request();
const res: any = new Response();
it('should call pipe', () => {
const mockRequest = request(); // <= ...so you can get it here
ProxyClass.proxy(req, res);
expect(mockRequest.pipe).toHaveBeenCalledTimes(1); // Success!
jest.clearAllMocks();
});
});
(обратите внимание, что вам не нужно импортировать jest
, так как jest
загружает и запускает ваши тестовые файлы и уже вставил себя в глобальную область)