Функция импорта из ручного макета Jest с Typescript - PullRequest
2 голосов
/ 31 октября 2019

Я создаю пользовательский макет (из класса ES6) с Jest в проекте Typescript. Макет создает конечные экспорты на несколько mock.fn(), чтобы их можно было отслеживать в наборе тестов.

Примером может быть официальный документ из документации Jest (https://jestjs.io/docs/en/es6-class-mocks#manual-mock). Там SoundPlayer класс был проверен, так как это единственный метод playSoundFile. Метод проверяется с помощью jest.fn(), который экспортируется для использования в тестах.

// soundPlayer.ts
export default class SoundPlayer {
  foo: string = 'bar';

  playSoundFile(filename: string) {
    console.log(`Playing sound file ${filename}`);
  }
}
// __mocks__/soundPlayer.ts
export const mockPlaySoundFile = jest.fn();

const mock = jest.fn().mockImplementation(() => {
  return { playSoundFile: mockPlaySoundFile };
});

export default mock;
// __tests__/soundPlayer.ts
import SoundPlayer, { mockPlaySoundFile } from '../soundPlayer';

jest.mock('../soundPlayer');

beforeEach(() => {
  mockPlaySoundFile.mockClear();
});

it('is called with filename', () => {
  const filename = 'song.mp3';
  const soundPlayer = new SoundPlayer();
  soundPlayer.playSoundFile(filename);

  expect(mockPlaySoundFile).toBeCalledWith(filename);
});

Тест работает, как и ожидалось, но TS уведомляет об ошибке (что для меня имеет смысл) при попытке импортировать ложную функцию * 1014. * Это потому, что, очевидно, mockPlaySoundFile не существует в soundPlayer.ts. из-за jest.mock('../soundPlayer'); макет импортируется из-под капота, поэтому экспорт существует.

Есть ли способ сообщить TS, чтобы он смотрел на макеты в подобных случаях?

...