Jest mockImplementation не существует на busboyConstructor - PullRequest
0 голосов
/ 14 января 2020

После всех моих исследований я не смог найти ответ на свою проблему.

Когда я пытаюсь издеваться над busboy в моем проекте, используя шутку, он продолжает говорить, что mockImplementationmockRestore) не является функцией

import * as Busboy from 'busboy';

jest.mock('busboy');
describe('Sample test', () => {
  const mockedEvenMap = {};

  beforeAll(() => {
    Busboy.mockImplementation(() => {
      return { // mock `on` event of Busby instance
        on: (event, callback) => {
          mockedEvenMap[event] = callback;
        },
      };
    });

  });

  afterAll(() => {
    Busboy.mockRestore();
  });
}

Busboy экспортирует свой конструктор в качестве значения модуля по умолчанию, но макет, похоже, не применяется.

busboy index.d.ts

declare module 'busboy' {
    const temp: busboy.BusboyConstructor;
    export = temp;
}

Версия Jest 24,9

Версия Busboy 0.3.1

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Я собираюсь взять другой угол здесь. Вероятно, вы создаете приложение, а не библиотеку Busboy, и вам, вероятно, нужно убедиться, что приложение работает правильно.

Задумывались ли вы о прохождении стека Express. js в своем тесте? Потому что написать тест, который отправляет запрос multipart / form-data, довольно просто. Например, используя supertest, вы можете сделать:

request(app)
  .post('/')
  .field('name', 'my awesome avatar')
  .attach('avatar', 'test/fixtures/avatar.jpg')
  ...

Таким образом, вам не придется пытаться смоделировать правильную комбинацию событий Busboy.

0 голосов
/ 15 января 2020

Вы должны использовать второй аргумент jest.mock (moduleName, factory, options) для насмешки над конструктором Busboy.

Например

main.ts:

import Busboy from 'busboy';

export function main() {
  const busboy = new Busboy({});
  busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
    console.log(
      'File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype,
    );
  });
}

main.test.ts:

import { main } from './main';
import Busboy from 'busboy';

jest.mock('busboy', () => {
  const mBusboy = {
    on: jest.fn(),
  };
  return jest.fn(() => mBusboy);
});

describe('59731700', () => {
  let busboy;
  beforeEach(() => {
    busboy = new Busboy({});
  });
  afterEach(() => {
    jest.clearAllMocks();
    jest.restoreAllMocks();
  });
  it('should pass', () => {
    const mockedEvenMap = {};
    busboy.on.mockImplementation((event, callback) => {
      mockedEvenMap[event] = callback;
    });
    const logSpy = jest.spyOn(console, 'log');
    main();
    mockedEvenMap['file']('a', 'b', 'c', 'd', 'e');
    expect(logSpy).toBeCalledTimes(1);
  });
});

Результаты модульных испытаний с отчетом о покрытии:

 PASS  src/stackoverflow/59731700/main.test.ts (16.143s)
  59731700
    ✓ should pass (22ms)

  console.log node_modules/jest-mock/build/index.js:860
    File [a]: filename: c, encoding: d, mimetype: e

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 main.ts  |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        18.09s

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59731700

...