[javascript] pruebas unitarias de funciones privadas con mocha y node.js



2 Answers

Mira el módulo de rewire . Le permite obtener (y manipular) variables y funciones privadas dentro de un módulo.

Entonces, en su caso, el uso sería algo así como:

var rewire = require('rewire'),
    foobar = rewire('./foobar'); // Bring your module in with rewire

describe("private_foobar1", function() {

    // Use the special '__get__' accessor to get your private function.
    var private_foobar1 = foobar.__get__('private_foobar1');

    it("should do stuff", function(done) {
        var stuff = private_foobar1(filter);
        should(stuff).be.ok;
        should(stuff).....
Question

Estoy usando mocha para probar la unidad de una aplicación escrita para node.js

Me pregunto si es posible probar las funciones de la unidad que no se han exportado en un módulo.

Ejemplo:

Tengo muchas funciones definidas así en foobar.js

function private_foobar1(){
    ...
}

function private_foobar2(){
    ...
}

y algunas funciones exportadas como públicas:

exports.public_foobar3 = function(){
    ...
}

El caso de prueba está estructurado de la siguiente manera:

describe("private_foobar1", function() {
    it("should do stuff", function(done) {
        var stuff = foobar.private_foobar1(filter);
        should(stuff).be.ok;
        should(stuff).....

Obviamente, esto no funciona, ya que private_foobar1 no se exporta.

¿Cuál es la forma correcta de probar los métodos privados? ¿Tiene mocha algunos métodos incorporados para hacer eso?




Seguí la respuesta de @barwin y verifiqué cómo se pueden hacer las pruebas unitarias con el módulo de recableado . Puedo confirmar que esta solución simplemente funciona.

El módulo debe ser requerido en dos partes: pública y privada. Para funciones públicas, puede hacerlo de forma estándar:

const { public_foobar3 } = require('./foobar');

Para ámbito privado:

const privateFoobar = require('rewire')('./foobar');
const private_foobar1 = privateFoobar .__get__('private_foobar1');
const private_foobar2 = privateFoobar .__get__('private_foobar2');

Para saber más sobre el tema, creé un ejemplo de trabajo con pruebas de módulo completo, las pruebas incluyen alcance privado y público.

Para obtener más información, lo invito a consultar el artículo ( https://medium.com/@macsikora/how-to-test-private-functions-of-es6-module-fb8c1345b25f ) que describe completamente el tema, incluye muestras de código.




Si prefiere mantenerlo simple, solo exporte los miembros privados, pero claramente separados de la API pública con alguna convención, por ejemplo, prefíquelos con un _ o anótelos bajo un solo objeto privado .

var privateWorker = function() {
    return 1
}

var doSomething = function() {
    return privateWorker()
}

module.exports = {
    doSomething: doSomething,
    _privateWorker: privateWorker
}



Related