当前位置: 首页 > 知识库问答 >
问题:

jest测试discord bot命令

伍溪叠
2023-03-14

所以我有一个使用模块导出的文件,它有4个字段,其中一个执行字段接受2个参数,本质上是一个函数。它不返回任何内容,而是使用discord。js并运行此消息。频道发送(“Pong”) 。我想用jest How do I:1测试一下,确保消息是正确的。频道send是用参数2中的“Pong”调用的-我如何模拟它,使它不会实际调用它(我只是想确保它里面的文本,就像实际参数是“Pong”,因为调用它将无法工作,因为缺少适当的消息对象)

我可以访问实际的命令并执行它,但我不确定如何检查message.channel.send的内容。消息对象不能由我重建,因此也可能需要嘲笑。

我在用discord.js但这不重要。

我还必须测试具有返回功能的命令,那么我应该如何处理它们呢?


共有1个答案

贲凌
2023-03-14

我实际上在处理一个不和谐的问题。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_flags: 0,
      system_channel_id: null,
      widget_enabled: false,
      widget_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')
  })
})

您还需要在您的jest配置中放入test环境:'节点'(请参阅此问题)。

您还可以使用Discord。雪花。generate()在需要获取时间戳等信息时生成id。

 类似资料:
  • 问题内容: 我有一个取决于环境变量的应用程序,例如: 我想测试例如: 可以通过节点env变量设置APP_PORT。 或某个应用程序正在使用以下命令设置的端口上运行 我如何用Jest做到这一点?我可以在每次测试之前设置这些变量,还是应该以某种方式模拟它? 问题答案: 在每次测试之前重设resetModules,然后在测试内部动态导入模块很重要: 如果您在运行Jest之前寻找一种加载env值的方法,请

  • 我有一个文件,其中包含以下几个helper函数,这些函数在不同的组件中使用。 下面是一个组件,它使用了文件中定义的函数。我正在为组件编写测试,我想模拟这里调用的外部函数。 我对jest/enzyze是新手,我不知道如何模拟外部函数buildoptions。我不知道如何模拟外部的buildOptions功能。有人能帮我做这个吗。下面是我的测试代码:

  • 我试图理解Jests的异步测试。 我的模块有一个函数,它接受一个布尔值并返回一个值的承诺。executer函数调用 ,在超时回调中,promise根据最初提供的布尔值进行解析或拒绝。代码如下所示: 我想用Jest来测试一下。我想我需要使用Jest提供的模拟计时器,所以我的测试脚本看起来有点像这样: 无论是否调用 ,我都会得到以下错误/失败测试 你能解释一下我哪里出错了吗?我该怎么做才能通过考试,保

  • 问题内容: 我对Jest和测试来说相对较新。我有一个带有输入元素的组件: 我想要一个测试来检查输入元素的功能是否以输入元素的属性作为参数。这是我到目前为止所走的距离: 我从这里的第一个解决方案开始模拟Jest And中的按钮单击:https : //facebook.github.io/jest/docs/en/mock- functions.html 编辑:运行以上会引发以下错误: 问题答案: