web-dev-qa-db-fra.com

Comment supprimer les messages de journalisation d'application d'une application node.js lors de l'exécution de tests unitaires?

Lors du test unitaire de mon application node.js (qui est essentiellement un REST backend) en utilisant mocha et supertest, je n'ai besoin que du message spécifique au test à l'écran, mais la sortie standard est également encombrée de messages du journal des applications.

Je commence le test unitaire avec:

mocha -R spec .

... et obtenez cette sortie (c'est ce que c'est ne devrait pas être):

[App] Listening on port 3000 ...
[App] Starting app, hooray!

  Project API
    GET /projects
[App] entering "projects" module ...
      √ should return an array of projects (317ms)

J'ai marqué le message du journal d'application avec [App]. Ce que je veux vraiment serait cette sortie du test unitaire:

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

Comment supprimer la sortie console.log/warn/error de l'application entrecoupée de la sortie reporter de Mocha?

SOLUTION:

En suivant l'approche de dankohn, je me suis retrouvé comme ça, ce qui résout mon problème (en utilisant winston pour la journalisation):

(dans le fichier serveur "principal" du nœud, 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' })
        ]
    });
}

... et pour définir la variable env, chaque fichier de test unitaire commence par:

process.env.NODE_ENV = 'test';
51
andimeier

Dans votre app.js:

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

En haut de chacun de vos fichiers mocha:

process.env.NODE_ENV = 'test';

Mise à jour:

Nous utilisons cette fonction dans notre code d'importation:

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

Ensuite, remplacez tous vos console.log('it worked') par logExceptOnTest('it worked'). L'astuce de base consiste à utiliser les variables d'environnement comme indicateur global du niveau de journalisation souhaité.

34
Dan Kohn

Déjà répondu mais j'ai pensé ajouter que vous pouvez faire cet utilisateur 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

Voici une solution assez simple qui utilise SinonJS 's test stubs pour supprimer tout console.log/info/warn/error instructions avant d'exécuter vos tests.

// 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