Пытаюсь настроить юнит-тестирование своего бота на 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,
}
В вашем командном файле, похоже, нет свойства help
для module.exports
. Когда вы пытаетесь прочитать help.name
, выдает ошибку, потому что help
не определено.
Убедитесь, что вы объявляете module.exports.help
в каждом командном файле.
Вы проверили один файл каждый в ./cmds/
?
Да и сейчас я тоже перепроверил, что так оно и есть
Войдите props
в консоль.
Это изображение console.info props
при обычном запуске бота (node bot.js
) i.imgur.com/BawYgcP.png После тестирования i.imgur.com/0ZHwUZj.png невозможно выполнить console.info в файле bot.js
Это происходит только во время тестирования?
Да, это происходит только во время тестирования
props.help
не определено. Объект экспорта необходимого файла либо пуст, либо не имеет help
, либо какое-то другое непредвиденное событие.
Хорошей практикой является всегда проверять, существует ли ключ объекта перед его использованием.
if (props && props.help) {
bot.commands.set(props.help.name, props)
} else {
//throw or handle error here
}
С этим кодом я могу запустить тест без ошибок. Я хотел бы знать, что я мог бы указать в операторе else, так как я не могу использовать console.info при тестировании. спасибо кстати
Вместо того, чтобы игнорировать ошибку, вы должны убедиться, что в каждом файле есть то, что вы ожидаете. Если вы даже не знаете, что делает ваш собственный код, как вы вообще можете надеяться его протестировать?
@AndreasG.DPetersen Извини, парень. Я не использовал шутку. Но попробуйте следующее: github.com/facebook/шутка/проблемы/2441 Некоторым людям удалось запустить console.info. У других не было. Вероятно, было бы лучше, если бы вы нашли «отладочное» решение, которое вы могли бы использовать вместе с шуткой.
@JoshyRobot Во-первых, никто не заявил, что игнорирует ошибку. Случай else явно указывает на необходимость обработки ошибки. Будь то событие журнала, процесс выхода, что бы ни решил разработчик. Во-вторых, «вы должны убедиться, что в каждом файле есть то, что вы ожидаете», о чем он заявил в своем ОП: «Я также проверил, что каждый из файлов в папке cmds заканчивается на module.exports.help». В-третьих, никогда не ожидайте, что ваш ввод будет работать так, как задумано! Всегда проверяйте и обрабатывайте случай else как лучше всего.
Я проверил каждый файл, и у всех есть этот ```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) ```