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';
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é.
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});
}
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