with usar unit test pruebas node hacer framework como node.js unit-testing automated-tests mocha sinon

node.js - usar - pruebas node js



¿Cómo hacer una prueba de unidad de salida de consola con mocha en nodejs? (3)

Prefiero mocha-sinon a mocha-sinon "simple" porque se integra muy bien con Mocha.

Ejemplo:

var expect = require(''chai'').expect; require(''mocha-sinon''); // Function to test, can also be in another file and as long as it''s // being called through some public interface it should be testable. // If it''s not in any way exposed/exported, testing will be problematic. function privateFunction (time) { if (time < 12) { console.log(''Good morning''); } if (time >= 12 && time <19) { console.log(''Good afternoon''); } else { console.log(''Good night!''); } } describe(''privateFunction()'', function() { beforeEach(function() { this.sinon.stub(console, ''log''); }); it(''should log "Good morning" for hours < 12'', function() { privateFunction(5); expect( console.log.calledOnce ).to.be.true; expect( console.log.calledWith(''Good morning'') ).to.be.true; }); it(''should log "Good afternoon" for hours >= 12 and < 19'', function() { privateFunction(15); expect( console.log.calledOnce ).to.be.true; expect( console.log.calledWith(''Good afternoon'') ).to.be.true; }); it(''should log "Good night!" for hours >= 19'', function() { privateFunction(20); expect( console.log.calledOnce ).to.be.true; expect( console.log.calledWith(''Good night!'') ).to.be.true; }); });

Un problema potencial: algunos reporteros de Mocha también usan console.log , por lo que las pruebas que lo apunten pueden no producir ningún resultado.

Hay una solución alternativa, pero tampoco es ideal porque intercalará la salida Mocha con la salida de privateFunction() . Si eso no es un problema, reemplace beforeEach() con esto:

beforeEach(function() { var log = console.log; this.sinon.stub(console, ''log'', function() { return log.apply(log, arguments); }); });

Tenga en cuenta el siguiente código Javascript de ejemplo a continuación:

function privateFunction (time) { if (time < 12) { console.log(''Good morning''); } if (time >= 12 && time <19) { console.log(''Good afternoon''); } else { console.log(''Good night!''); } };

¿Cómo debo hacer una prueba unitaria de que en nodejs usando mocha (y posiblemente sinonjs), notando que esta es una función privada llamada dentro de un módulo? Necesito pasar el argumento y verificar si la función está registrando lo correcto en la consola.

¿Puedo hacer lo mismo con console.warn y console.error ?


Si su propósito es únicamente probar la salida de la consola, sugeriría en lugar de stubs / spies, etc. en las llamadas a métodos, usar algo como:

  • test-console

  • monitorea stdout / stderr en su lugar, puedes usar ideas de esta gist


ignorando el hecho de que es una función privada, daría un par de pasos; refactorice mi código para una mejor separación de inquietudes y utilice esta separación con pruebas dobles.

  • saque todos los efectos secundarios de sus propios módulos (el efecto secundario aquí es escribir en la consola):

    fuera.js

    function log (message) { console.log(message); }; module.exports = {log};

    app.js

    const {log} = require(''out''); function greeter (time) { if (time < 12) { log(''Good morning''); } if (time >= 12 && time < 19) { log(''Good afternoon''); } else { log(''Good night!''); } }; module.exports = {greeter};

  • use algún módulo proxy / espía, como proxyquire para reemplazar a todo el escritor cuando realice la prueba:

    app.spec.js

    describe(''output writers'', function(){ const fakeOut = { log: sinon.spy(), }; const app = proxyquire(''./app'', { ''out'': fakeOut }); it(''should log to the fake out'', function(){ app.greeter(15); assert(fakeOut.log.calledOnce); }); });