Как подавить сообщения регистрации приложений из приложения node.js при выполнении модульных тестов?
При модульном тестировании моего приложения node.js(которое в основном является бэкэнд REST) с использованием мокко и супертеста, мне нужно только тестовое сообщение на экране, но stdout также захламляется сообщениями журнала приложений.
Я запускаю unit test с помощью
mocha -R spec .
... и получить этот вывод (этого не должно быть):
[App] Listening on port 3000 ...
[App] Starting app, hooray!
Project API
GET /projects
[App] entering "projects" module ...
√ should return an array of projects (317ms)
Я отметил сообщение журнала приложения с помощью [App]. То, что я действительно хочу, будет этот вывод из unit test:
Project API
GET /projects
√ should return an array of projects (317ms)
Как я могу подавить вывод console.log/warn/error приложением, перемежающимся с выходом репортера Mocha?
РЕШЕНИЕ:
Следуя подходу dankohn, я закончил так, что решает мою проблему (используя winston для ведения журнала):
(в node "основном" файле сервера, server.js:)
if (process.env.NODE_ENV !== 'test') {
logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ filename: 'foo.log' })
]
});
} else {
// while testing, log only to file, leaving stdout free for unit test status messages
logger = new (winston.Logger)({
transports: [
new (winston.transports.File)({ filename: 'foo.log' })
]
});
}
... и для установки переменной env каждый файл unit test начинается с:
process.env.NODE_ENV = 'test';
Ответы
Ответ 1
В вашем приложении app.js:
if (process.env.NODE_ENV !== 'test') {
app.use(express.logger());
}
В верхней части каждого из ваших файлов мокко:
process.env.NODE_ENV = 'test';
Update:
Мы используем эту функцию в нашем коде импорта:
function logExceptOnTest(string) {
if (process.env.NODE_ENV !== 'test') {
console.log(string);
}
}
Затем замените все ваши console.log('it worked')
на logExceptOnTest('it worked')
. Основной трюк заключается в использовании переменных среды в качестве глобального флага в отношении уровня ведения журнала, который вы хотите.
Ответ 2
Уже ответил, но думал, что добавлю, что вы можете сделать этого пользователя winston.add()
var logger = new (winston.Logger)({
transports: [
new (winston.transports.File)({filename: 'node.log'})
]
});
if (process.env.NODE_ENV === 'test') {
logger.add(winston.transports.Console, {prettyPrint: true});
}