在单元测试我的 node 时.js应用程序(基本上是一个REST后端)使用mocha和supertest,我只需要屏幕上显示特定于测试的消息,但stdout中也充斥着应用程序日志(log)消息.

我从以下内容开始单元测试:

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]标记了应用程序日志(log)消息.I really want将是单元测试的输出:

  Project API
    GET /projects
      √ should return an array of projects (317ms)

我怎样才能 suppress 控制台.应用程序的日志(log)/警告/错误输出与Mocha的reporter输出交错?

SOLUTION:

按照dankohn的方法,我的结局是这样的,这解决了我的问题(使用winston进行日志(log)记录):

(在 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变量,每个单元测试文件都以以下内容开头:

process.env.NODE_ENV = 'test';

推荐答案

在你的应用程序中.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);
  }
}

然后,用logExceptOnTest('it worked')替换你所有的console.log('it worked').基本技巧是使用环境变量作为全局标志,以确定所需的日志(log)记录级别.

Node.js相关问答推荐

node 上的磁盘压力

Mongoose更新在^8.0.3版中,许多似乎不能按预期工作

如何使用聚合管道交换键值对

我需要聚合两个 MongoDB 集合

错误:无法为 /blog 收集页面数据并且在 object.fetch 处获取失败

使用mongoose 创建新文档并仅取回选定的字段

错误:找不到模块'C:\Users\nguye\AppData\Local\nodejs\node_modules\npm\bin\npm-cli.js'

多个 Axios 请求合并

在 Express.js 中迭代子文档数组

node.js 变量不存在代码块

等到文件上传完成的有效方法(mongoose )

如何将使用 Gulp 的 node 部署到 heroku

Node.js + Express 上的多个视图路径

Node.js 服务器中没有缓存

Dart 语言比 JavaScript (Node.js) 有什么好处

React Native ios build:找不到 node

Route.get() 需要回调函数,但得到对象未定义

node.js 在控制台上显示未定义

如何在express 中设置默认路径(路由前缀)?

在 Node.js 上使用 Connect 无法获取 /