如何在运行单元测试时抑制来自node.js应用程序的应用程序日志消息?

时间:2014-03-28 10:15:20

标签: node.js unit-testing mocha

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

我用:

开始单元测试
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]标记了应用程序日志消息。我真正想要的将是单元测试的输出:

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

如何通过散布在Mocha记者输出中的应用程序来抑制console.log / warn / error输出?

SOLUTION:

遵循dankohn的方法,我最终得到了这个,解决了我的问题(使用winston进行记录):

(在节点的“主”服务器文件中,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';

4 个答案:

答案 0 :(得分:32)

在你的app.js中:

if (process.env.NODE_ENV !== 'test') {
  app.use(express.logger());
}

在每个mocha文件的顶部:

process.env.NODE_ENV = 'test';

<强>更新

我们在导入代码中使用此函数:

function logExceptOnTest(string) {
  if (process.env.NODE_ENV !== 'test') {
    console.log(string);
  }
}

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

答案 1 :(得分:7)

已经回答,但我想我会补充说你可以做这个用户winston.add()

&#13;
&#13;
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});
}
&#13;
&#13;
&#13;

答案 2 :(得分:2)

您可以使用mocha-suppress-logs隐藏成功测试生成的日志,但仍保留失败测试生成的日志以简化调试。

安装:

npm install --save-dev mocha-suppress-logs

然后像这样使用它:

const suppressLogs = require('mocha-suppress-logs');
 
describe('Something', () => {
  suppressLogs();
 
  it('should do something', () => {
    // test code
  });
});

您还可以在整个测试套件中进行全局操作。

这是该模块的链接:

https://www.npmjs.com/package/mocha-suppress-logs

答案 3 :(得分:1)

这是一个非常简单的解决方案,在运行测试之前,使用SinonJStest stubs抑制所有console.log/info/warn/error语句。

// my-method.js

export function myMethod() {
    console.log(`I'm about to return true`)
    return true
}

// my-method.test.js

import {describe, it, before} from 'mocha'
import chai from 'chai'
import sinon from 'sinon'
import chalk from 'chalk'
import {myMethod} from './my-method.js'

const expect = chai.expect

describe(chalk.underline('My Test Group'), () => {

    before(() => {
        sinon.stub(console, 'log')  // disable console.log
        sinon.stub(console, 'info')  // disable console.info
        sinon.stub(console, 'warn')  // disable console.warn
        sinon.stub(console, 'error')  // disable console.error
    })

    describe('myMethod', () => {
        it('should return true', () => {
            expect(myMethod()).to.be.true  // without printing to the console
        })
    })
})

// output

My Test Group
  myMethod
    ✓ should return true