使用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';
答案 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()
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;
答案 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
});
});
您还可以在整个测试套件中进行全局操作。
这是该模块的链接:
答案 3 :(得分:1)
这是一个非常简单的解决方案,在运行测试之前,使用SinonJS的test 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