¿Cómo acceder y probar una función interna (no de exportación) en un módulo node.js?

Resuelto xavier.seignard asked hace 11 años • 11 respuestas

Estoy tratando de descubrir cómo probar funciones internas (es decir, no exportadas) en nodejs (preferiblemente con mocha o jasmine). ¡Y no tengo idea!

Digamos que tengo un módulo como ese:

function exported(i) {
   return notExported(i) + 1;
}

function notExported(i) {
   return i*2;
}

exports.exported = exported;

Y la siguiente prueba (mocha):

var assert = require('assert'),
    test = require('../modules/core/test');

describe('test', function(){

  describe('#exported(i)', function(){
    it('should return (i*2)+1 for any given i', function(){
      assert.equal(3, test.exported(1));
      assert.equal(5, test.exported(2));
    });
  });
});

¿Hay alguna forma de realizar una prueba unitaria de la notExportedfunción sin exportarla, ya que no debe exponerse?

xavier.seignard avatar Feb 14 '13 18:02 xavier.seignard
Aceptado

El módulo de recableado es definitivamente la respuesta.

Aquí está mi código para acceder a una función no exportada y probarla usando Mocha.

aplicación.js:

function logMongoError(){
  console.error('MongoDB Connection Error. Please make sure that MongoDB is running.');
}

prueba.js:

var rewire = require('rewire');
var chai = require('chai');
var should = chai.should();


var app = rewire('../application/application.js');


var logError = app.__get__('logMongoError'); 

describe('Application module', function() {

  it('should output the correct error', function(done) {
      logError().should.equal('MongoDB Connection Error. Please make sure that MongoDB is running.');
      done();
  });
});
Anthony avatar Jun 12 '2015 02:06 Anthony

El truco consiste en establecer la NODE_ENVvariable de entorno en algo así como testy luego exportarla condicionalmente.

Suponiendo que no hayas instalado mocha globalmente, podrías tener un Makefile en la raíz del directorio de tu aplicación que contenga lo siguiente:

REPORTER = dot

test:
    @NODE_ENV=test ./node_modules/.bin/mocha \
        --recursive --reporter $(REPORTER) --ui bbd

.PHONY: test

Este archivo make configura NODE_ENV antes de ejecutar mocha. Luego puede ejecutar sus pruebas de mocha make testen la línea de comando.

Ahora, puedes exportar condicionalmente tu función que generalmente no se exporta solo cuando se ejecutan tus pruebas de mocha:

function exported(i) {
   return notExported(i) + 1;
}

function notExported(i) {
   return i*2;
}

if (process.env.NODE_ENV === "test") {
   exports.notExported = notExported;
}
exports.exported = exported;

La otra respuesta sugirió usar un módulo vm para evaluar el archivo, pero esto no funciona y arroja un error que indica que las exportaciones no están definidas.

Matthew Bradley avatar Oct 13 '2013 10:10 Matthew Bradley