ОБНОВЛЕНИЕ: Я считаю, что нашел (возможно, хакерский) способ решения обеих проблем, завтра опубликую обновленный код и решения для всех, кого это интересует.
Я пытаюсь создать приложение CLI и решил, что хотел отформатировать вывод журнала для лучшего взаимодействия с пользователем, включая добавление подробного режима. Таким образом, я установил Winston и смог заставить его работать так, как я хотел. Затем я установил jest, поскольку приложение становится все более сложным, поэтому я хотел автоматизировать тестирование. Я решил сделать свой первый тест для регистратора, так как это было последнее, над чем я работал, и я сразу же столкнулся с проблемами. Мой план состоял в том, чтобы подсчитать строки вывода из журнала консоли и проверить, что они равны десяти: тогда это означало бы, что мне не пришлось бы жестко кодировать какие-либо сообщения об ошибках, указанные в c, которые могут измениться, если я решу изменить форматирование журнала позднее. Мне также нужен тест, который изменяет переменную среды с dev на prod, чтобы убедиться, что она правильно работает в обеих средах: кто-нибудь знает, возможно ли это? В настоящее время я использую dotenv для управления своими переменными среды и добавил соответствующий код в свой файл конфигурации jest, чтобы он правильно считывал переменные. Я читал различные сообщения о переполнении стека и шутливые документы о фиктивных функциях в попытке решить эти проблемы, но все это пролетает над моей головой. Мне не нужен этот тест, чтобы продолжить работу с моим приложением, поскольку я вполне уверен, что все работает нормально, но разочаровывает то, что не могу решить эти проблемы, и было бы полезно узнать об этом в будущем в случае мне действительно нужно сделать тест, который полагается на вывод журнала. Может ли кто-нибудь помочь?
set-log-to. js
const { createLogger, format, transports } = require('winston');
const { combine, printf, errors } = format;
const nodeEnvironment = process.env.NODE_ENV;
const cc = require('../constants/chalk-classes');
const {
fatal,
caveat,
victory,
error,
warn,
attempt,
success,
info,
debug,
plain,
} = cc;
const config = {
levels: {
fatal: 0,
caveat: 0,
victory: 0,
error: 1,
warn: 2,
attempt: 3,
success: 3,
info: 3,
verbose: 4,
debug: 5,
},
};
const formatting = combine(
errors({ stack: true }),
printf((infoObj) => {
const { level, message } = infoObj;
switch (level) {
case 'fatal':
return `${fatal(`${level}:`)} ${plain(message)}`;
case 'caveat':
return `${caveat(`${level}:`)} ${plain(message)}`;
case 'victory':
return `${victory(`${level}:`)} ${plain(message)}`;
case 'error':
return `${error(`${level}: ${message}`)}`;
case 'warn':
return `${warn(`${level}: ${message}`)}`;
case 'attempt':
return `${attempt(message)}`;
case 'success':
return `${success(message)}`;
case 'info':
return `${info(message)}`;
case 'verbose':
return `${plain(message)}`;
case 'debug':
return `${debug(level)}: ${plain(message)}`;
}
})
);
function setLevel(level) {
if (!level) {
if (nodeEnvironment === 'dev') {
return (level = 'debug');
} else {
return (level = 'warn');
}
} else {
return level;
}
}
function setLogTo(level) {
level = setLevel(level);
const log = createLogger({
levels: config.levels,
level,
transports: [
new transports.Console({
format: formatting,
}),
],
});
return log;
}
module.exports = setLogTo;
set-log-to.test. js
const setLogTo = require('../set-log-to');
test('All log levels function correctly', () => {
let log = setLogTo('debug');
log.fatal('This is fatal');
log.caveat('This is a caveat');
log.victory('This is a victory');
log.error('This is an error');
log.warn('This is a warning');
log.attempt('This is an attempt');
log.success('This is a success');
log.info('This is some info');
log.verbose('This is verbose');
log.debug('This is a debug');
expect(???).toEqual(10);
});
test('Logger does not print debug as standard', () => {
let log = setLogTo();
log.warn('This is a warning');
log.verbose('This is a verbose statement');
log.debug('This is a debug statement');
expect(???).toEqual(1);
});
test('Logger does not print info when set to error', () => {
let log = setLogTo('error');
log.info('This is an info statement');
log.error('This is an error')
expect(???).toEqual(1);
});
test('Dotenv works correctly', () => {
let log = setLogTo();
log.debug('This is a debug');
nodeEnvironment = 'prod';
log.debug('This us a debug');
expect(???).toEqual(1)
});