首页 > 解决方案 > 如何使用 Jest 测试同一类中的方法调用?

问题描述

我正在尝试测试类中的函数调用以确保它们被调用,但我似乎无法弄清楚如何使用 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 是空的,因此会出错。

标签: javascriptjestjs

解决方案


我建议你不要嘲笑任何内部方法。相反,您可以模拟任何外部依赖项并调用应该是公共的方法。然后,您针对返回的公共(应该在外部调用)方法运行断言,并检查模拟(模拟的外部依赖项)是否被调用。

在这个特定的例子中,只有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 元素。但是方法是一样的。


推荐阅读