Дразнить класс из NPM модуля с помощью Jest, что дает мне проблему с конструктором - PullRequest
2 голосов
/ 14 апреля 2020

Я пытаюсь издеваться над модулем 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, et c. Являются классами раздора. js module), но я не уверен, как это правильно сделать

У объекта сообщения есть свойство 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 Ответ

4 голосов
/ 21 апреля 2020

Это потому, что вы определяете Message как функцию, а не как объект:

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

Если вам нужно смоделировать все поведение объекта Message, вы можете создать фиктивный класс и смоделировать его поведение, которое способ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...