Подтвердить что ты не робот

Как подавить сообщения регистрации приложений из приложения 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';
4b9b3361

Ответ 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});
}