Функция модуля запроса макета с использованием jest в машинописи - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь использовать макет request() функцию модуля узла request, используя jest в машинописном тексте, но я не смог этого сделать, может кто-нибудь помочь мне, где что-то пошло не так?Кстати, я пытаюсь создать общую прокси-функцию, которая должна работать со всеми методами http, такими как get, post, delete, update.Поэтому я хочу использовать функцию request() только вместо request.get (), request.post () ... и т. Д., Используя лестницу if-else, основанную на методе запроса.

Proxy.ts:

import * as request from 'request';

export default class ProxyClass {
  static proxy(req: any, res: any): any {
    const options: any = {
      headers: req.headers,
    }
    const proxyReq: any = request(options);
    proxyReq.on('error', (err: any) => {
      return res.status(500).send(err);
    });
    return proxyReq.pipe(res);
  }
}

Proxy.spec.ts:

import 'jest';
import * as request from 'request';
import {Request} from 'jest-express/lib/request';
import {Response} from 'jest-express/lib/response';
import ProxyClass from './Proxy';

describe('proxy request', () => {
  const req: any = new Request();
  const res: any = new Response();
  it('should call pipe', () => {
    const mockRequest = {
      pipe: jest.fn(),
      on: jest.fn(),
    }

    jest.mock('request', () => {
      return function() {
        return mockRequest;
      }
    });

    ProxyClass.proxy(req, res);
    expect(mockRequest.pipe).toHaveBeenCalledTimes(1);
    jest.clearAllMocks();
  });
});

И когда я запускаю выше теста, я получаю ошибку: TypeError: request is not a function

1 Ответ

1 голос
/ 06 мая 2019

Если вы получаете 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 загружает и запускает ваши тестовые файлы и уже вставил себя в глобальную область)

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