用Jest模拟NPM模块中的类,给我构造函数问题

时间:2020-04-14 10:43:34

标签: javascript node.js reactjs testing jestjs

我正在尝试模拟Discord.JS模块。该模块具有一个Client类,我将在“ Bot”类中进行扩展。我想模拟该模块,以便可以模拟其他类的一些方法,例如“消息”和“通道”,但是我不知道如何模拟一个特定的类 NPM模块。试图在开玩笑的文档和Google上找到一些东西,但是Google的结果只是链接到文档。我不断收到此问题class extends value of undefined is not a constructor or null。这就是我的测试文件

jest.mock('discord.js', () => ({

}));

我知道我需要手动模拟其他类(Client,Message,Channel等是discord.js模块的类),但是我不确定如何正确地做到这一点

消息对象具有一个称为channel的属性,该属性是一个通道对象,而该通道对象具有.send()方法,所以我尝试了

jest.mock('discord.js', () => ({
  Client: jest.fn(),
  Message: jest.fn().mockImplementation(() => ({
    channel: jest.fn().mockImplementation(() => ({
      send: jest.fn((x) => 'Hello World'),
    })),
  })),
}));

但它一直说msg.channel.send不是方法

describe('should test all commands', () => {

  let info: BaseCommand;
  let bot: Bot;
  let msg: Message;
  beforeAll(() => {
    info = new InfoCommand();
    bot = new Bot({});
    msg = new Message(bot, null, null);
    jest.spyOn(bot, 'addCommand');
  });

  test('should check if command arguments are invoked correctly', () => {
    msg.channel.send('x');
  });
});

1 个答案:

答案 0 :(得分:4)

这是因为您将Message定义为函数而不是对象:

   jest.mock('discord.js', () => ({
      Client: jest.fn(),
      Message: {
        channel: {
          send: jest.fn()
        }
      }
    }));

如果您需要模拟Message对象的整个行为,则可以创建一个模拟类并以此方式模拟其行为