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出力を抑制するにはどうすればよいですか?
ソリューション:
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';
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')
に置き換えます。基本的なトリックは、必要なロギングのレベルに関するグローバルフラグとして環境変数を使用することです。
すでに答えましたが、このユーザー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});
}
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