Как проверить вызовы методов в том же классе, используя Jest? - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь проверить вызовы функций внутри класса, чтобы убедиться, что они вызваны, но я не могу понять, как это сделать с помощью Jest.

Автоматические насмешки не работаюти ни один из них не вызывает jest.mock с параметром фабрики модулей.

Это рассматриваемый класс, и я хочу проверить, что вызов play () вызывает playSoundFile ().

class SoundPlayer {
  constructor() {
    this.foo = 'bar';
  }

  playSoundFile(fileName) {
    console.log('Playing sound file ' + fileName);
  }

  play() {
    this.playSoundFile('song.mp3');
  }
}

module.exports = SoundPlayer;

Это тестовый файл:

const SoundPlayer = require('../sound-player');
jest.mock('../sound-player');

it('test', () => {
  const soundPlayerConsumer = new SoundPlayer();

  const coolSoundFileName = 'song.mp3';
  soundPlayerConsumer.play();

  const mockPlaySoundFile = SoundPlayer.mock.instances[0].playSoundFile;
  expect(mockPlaySoundFile.mock.calls[0][0]).toEqual(coolSoundFileName);
});

mockPlaySoundFile.mock.calls пуст и из-за этого выдает ошибку.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Я предлагаю вам не издеваться над внутренним методом. Вместо этого вы можете смоделировать любую внешнюю зависимость и вызвать методы, которые должны быть открытыми. Затем вы запускаете утверждения, возвращаемые методами public (которые должны вызываться извне), а также проверяете mocks (поддельные внешние зависимости) на предмет того, что они были / не были вызваны.

В этом конкретном примере просто console.log:

console.log = jest.fn();
const soundPlayerConsumer = new SoundPlayer();
soundPlayerConsumer.play();
expect(console.log).toHaveBeenCalledTimes(1);
expect(console.log).toHaveBeenCalledWith('Playing sound file song.mp3');

В более реальном сценарии может потребоваться, чтобы вы высмеяли document или даже использовали jsdom, чтобы высмеивать <audio /> элемент HTML. Но подход был бы таким же.

0 голосов
/ 14 мая 2019

Если я не высмеиваю весь класс и просто слежу за функцией, она работает. Однако это не обходится тестированием интенсивных функций, например, звонки в базу данных.

const SoundPlayer = require('../sound-player');

it('test', () => {
  const soundPlayerConsumer = new SoundPlayer();
  const playSpy = jest.fn();
  soundPlayerConsumer.playSoundFile = fileName => playSpy(fileName);

  soundPlayerConsumer.play();

  expect(playSpy).toHaveBeenCalledWith('song.mp3');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...