¿Cómo acceder y probar una función interna (no de exportación) en un módulo node.js?
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 notExported
función sin exportarla, ya que no debe exponerse?
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();
});
});
El truco consiste en establecer la NODE_ENV
variable de entorno en algo así como test
y 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 test
en 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.