Неопределенное свойство при модульном тестировании моего бота discord.js (сам тест пройден, но за ним следует ошибка)

Пытаюсь настроить юнит-тестирование своего бота на discord.js, но при запуске npm test в терминале во время прохождения теста все равно выдает ошибку.

Это изображение пройденного теста, за которым следует ошибка: https://i.imgur.com/m2EOuxc.png

Мне нужно исправить эту ошибку при тестировании, пока бот еще может функционировать.

Я попытался полностью удалить строку, указанную в ошибке (и строки, которые имели какое-то отношение к этой конкретной строке)

  jsfiles.forEach((f, i) => {
    let props = require(`./cmds/${f}`)
    bot.commands.set(props.help.name, props)
  })

Удаление этого решило проблему тестирования, но привело к тому, что бот не работал правильно (он не загружал команды, то есть с ботом нельзя было взаимодействовать), что здесь не является целью.

Я также проверил, что каждый из файлов в папке cmds заканчивается на

module.exports.help = {
  name: '<name of the command I use for each command>'
} 

Это часть моего файла bot.js, которая содержит проблему.

// Loads the commands for the bot:
fs.readdir('./cmds/', (err, files) => {
  if (err) console.error(err)

  let jsfiles = files.filter(f => f.split('.').pop() === 'js')
  if (jsfiles.length <= 0) {
    console.info('No commands to load!')
    return
  }

  if (testingSettings) {
    console.info(`Loading ${jsfiles.length} commands!`)
  }

  // This is the problem referenced above: 
  // ----------------------------------------------------------------------
  jsfiles.forEach((f, i) => {
    let props = require(`./cmds/${f}`)
    bot.commands.set(props.help.name, props)
  })
  // ----------------------------------------------------------------------

})

Это весь мой код в файле bot.test.js

const { 
  // Functions
  checkingTesting,

  // Variables
  testingSettings,
} = require('./bot')


test('checking to see if testing-mode is on', () => {
  expect(checkingTesting(testingSettings, 'token')).toBe(process.env['token']);
});

Если это необходимо. Это функция, переменная и метод экспорта, которые используются для подключения bot.js к bot.test.js:

Переменная (в файле bot.js)

const testingSettings = false

Функция (в файле bot.js)

function checkingTesting (testingSettings, name) {
  if (testingSettings) {
    return testSettings[name]
  } else if (!testingSettings) {
    return process.env[name]
  }  
}

Экспорт (в файл bot.js)

module.exports = {
  // Exporting functions
  checkingTesting: checkingTesting,


  // Exporting variables
  testingSettings: testingSettings,
}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
764
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем командном файле, похоже, нет свойства help для module.exports. Когда вы пытаетесь прочитать help.name, выдает ошибку, потому что help не определено.

Убедитесь, что вы объявляете module.exports.help в каждом командном файле.

Я проверил каждый файл, и у всех есть этот ```module.exports.help = { name: '<имя команды, которую я использую для каждой команды>' } ```Я пытался удалить все файлы в папке cmds . Это сработало, но только потому, что этот код: ``` let jsfiles = files.filter(f => f.split('.').pop() === 'js') if (jsfiles.length <= 0) { // console.info('Нет команд для загрузки!') return } ``` останавливает остальную часть выполнения от перехода к этому ``` bot.commands.set(props.help.name, props) ```

Andreas G.D Petersen 13.06.2019 15:23

Вы проверили один файл каждый в ./cmds/?

slothiful 13.06.2019 15:26

Да и сейчас я тоже перепроверил, что так оно и есть

Andreas G.D Petersen 13.06.2019 15:31

Войдите props в консоль.

slothiful 13.06.2019 15:36

Это изображение console.info props при обычном запуске бота (node bot.js) i.imgur.com/BawYgcP.png После тестирования i.imgur.com/0ZHwUZj.png невозможно выполнить console.info в файле bot.js

Andreas G.D Petersen 13.06.2019 15:46

Это происходит только во время тестирования?

slothiful 13.06.2019 15:50

Да, это происходит только во время тестирования

Andreas G.D Petersen 13.06.2019 15:55
Ответ принят как подходящий

props.help не определено. Объект экспорта необходимого файла либо пуст, либо не имеет help, либо какое-то другое непредвиденное событие.

Хорошей практикой является всегда проверять, существует ли ключ объекта перед его использованием.

if (props && props.help) {
    bot.commands.set(props.help.name, props)
} else {
    //throw or handle error here
}

С этим кодом я могу запустить тест без ошибок. Я хотел бы знать, что я мог бы указать в операторе else, так как я не могу использовать console.info при тестировании. спасибо кстати

Andreas G.D Petersen 13.06.2019 15:57

Вместо того, чтобы игнорировать ошибку, вы должны убедиться, что в каждом файле есть то, что вы ожидаете. Если вы даже не знаете, что делает ваш собственный код, как вы вообще можете надеяться его протестировать?

jotch 13.06.2019 15:59

@AndreasG.DPetersen Извини, парень. Я не использовал шутку. Но попробуйте следующее: github.com/facebook/шутка/проблемы/2441 Некоторым людям удалось запустить console.info. У других не было. Вероятно, было бы лучше, если бы вы нашли «отладочное» решение, которое вы могли бы использовать вместе с шуткой.

user2180833 13.06.2019 16:35

@JoshyRobot Во-первых, никто не заявил, что игнорирует ошибку. Случай else явно указывает на необходимость обработки ошибки. Будь то событие журнала, процесс выхода, что бы ни решил разработчик. Во-вторых, «вы должны убедиться, что в каждом файле есть то, что вы ожидаете», о чем он заявил в своем ОП: «Я также проверил, что каждый из файлов в папке cmds заканчивается на module.exports.help». В-третьих, никогда не ожидайте, что ваш ввод будет работать так, как задумано! Всегда проверяйте и обрабатывайте случай else как лучше всего.

user2180833 13.06.2019 16:35

Другие вопросы по теме