шутить тестирование разногласия с ботом - PullRequest
0 голосов
/ 29 марта 2020

Итак, у меня есть файл, в котором я использую модуль экспорта, и он имеет 4 поля, среди которых поле выполнения, которое принимает 2 аргумента и по сути является функцией. Он ничего не возвращает, вместо этого он использует discord. js и запускает этот message.channel.send('Pong');. Я хочу проверить это с помощью jest Как я: 1 - Убедитесь, что message.channel.send был вызван с 'Pong' в качестве аргументов 2 - Как мне высмеивать его, чтобы он на самом деле не вызывал его (я просто хочу убедиться, что что текст внутри него, как и фактический аргумент, - «Понг», поскольку его вызов не будет работать из-за отсутствия надлежащего объекта сообщения)

Я могу получить доступ к фактической команде и выполнить ее, но я не знаете, как проверить содержимое message.channel.send. Объект сообщения не может быть восстановлен мной, так что, возможно, также потребуется насмешка.

Я использую Discord. js, но это не должно иметь большого значения.

Мне также придется проверять команды, которые имеют возвращаемые функции, так как я должен go о них?

1 Ответ

1 голос
/ 30 марта 2020

На самом деле я работаю над Discord. js библиотека для насмешек, но пока это не сделано, вы можете сделать это:

const Discord = require('discord.js')

// replace this with whatever the execute command is
// e.g. const ping = require('./commands/ping').execute
const ping = async (message, args) => {
  message.channel.send('Pong')
}

// a counter so that all the ids are unique
let count = 0

class Guild extends Discord.Guild {
  constructor(client) {
    super(client, {
      // you don't need all of these but I just put them in to show you all the properties that Discord.js uses
      id: count++,
      name: '',
      icon: null,
      splash: null,
      owner_id: '',
      region: '',
      afk_channel_id: null,
      afk_timeout: 0,
      verification_level: 0,
      default_message_notifications: 0,
      explicit_content_filter: 0,
      roles: [],
      emojis: [],
      features: [],
      mfa_level: 0,
      application_id: null,
      system_channel_id: null
    })
    this.client.guilds.cache.set(this.id, this)
  }
}

class TextChannel extends Discord.TextChannel {
  constructor(guild) {
    super(guild, {
      id: count++,
      type: 0
    })
    this.client.channels.cache.set(this.id, this)
  }

  // you can modify this for other things like attachments and embeds if you need
  send(content) {
    return this.client.actions.MessageCreate.handle({
      id: count++,
      type: 0,
      channel_id: this.id,
      content,
      author: {
        id: 'bot id',
        username: 'bot username',
        discriminator: '1234',
        bot: true
      },
      pinned: false,
      tts: false,
      nonce: '',
      embeds: [],
      attachments: [],
      timestamp: Date.now(),
      edited_timestamp: null,
      mentions: [],
      mention_roles: [],
      mention_everyone: false
    })
  }
}

class Message extends Discord.Message {
  constructor(content, channel, author) {
    super(channel.client, {
      id: count++,
      type: 0,
      channel_id: channel.id,
      content,
      author,
      pinned: false,
      tts: false,
      nonce: '',
      embeds: [],
      attachments: [],
      timestamp: Date.now(),
      edited_timestamp: null,
      mentions: [],
      mention_roles: [],
      mention_everyone: false
    }, channel)
  }
}

const client = new Discord.Client()
const guild = new Guild(client)
const channel = new TextChannel(guild)

// the user that executes the commands
const user = {id: count++, username: 'username', discriminator: '1234'}

describe('ping', () => {
  it('sends Pong', async () => {
    await ping(new Message('ping', channel, user))
    expect(channel.lastMessage.content).toBe('Pong')
  })
})

Вам также необходимо указать testEnvironment: 'node' в конфигурации Jest (см. эта проблема ).


Редактировать

Вы также можете использовать Discord.SnowflakeUtil.generate() для создания идентификатора, если вам нужно получить такие вещи, как отметка времени.

...