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

btqmn9zl  于 2023-05-06  发布在  Node.js
关注(0)|答案(6)|浏览(130)

在使用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)

我怎样才能抑制应用程序的console.log/warn/error输出与Mocha的reporter输出之间的穿插?

解决方案:

遵循dankohn的方法,我最终像这样解决了我的问题(使用winston进行日志记录):
(in node的“main”服务器文件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';
fxnxkyjh

fxnxkyjh1#

在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')。最基本的技巧是使用环境变量作为全局标志,以指示您想要的日志记录级别。

wribegjk

wribegjk2#

这里有一个非常简单的解决方案,它使用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
irtuqstp

irtuqstp3#

已经回答了,但我想我会补充说,你可以做这个用户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});
}
dm7nw8vv

dm7nw8vv4#

您可以使用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

kcugc4gi

kcugc4gi5#

仔细看看the-log。要隐藏日志,您只需要在某些测试脚本中激活一次静默模式:

require('the-log').silent(); // That's all!!))
      
describe('Something', () => {
  it('should do something', () => {
    // test code
  });
});

关于the-loghttps://github.com/ivanoff/the-log

xqnpmsa8

xqnpmsa86#

很晚才去派对,但直接进入测试文件,你可以放心地写:

console.log = () => {};

你的应用程序不会显示任何日志,而摩卡则会。

相关问题