web-dev-qa-db-ja.com

単体テストの実行時に、node.jsアプリケーションからのアプリケーションログメッセージを抑制する方法

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';
51
andimeier

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')に置き換えます。基本的なトリックは、必要なロギングのレベルに関するグローバルフラグとして環境変数を使用することです。

34
Dan Kohn

すでに答えましたが、このユーザー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});
}
7
Justin Hamade

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
3
Derek Soike