test software node framework javascript node.js mocha

javascript - software - ¿Cómo puedo hacer que Mocha cargue un archivo helper.js que defina ganchos globales o utilidades?



node js test framework (5)

Tengo un archivo llamado test/helper.js que utilizo para ejecutar pruebas de Mocha en mis aplicaciones Node.js. Mi estructura de pruebas se ve como:

test/ test/helper.js # global before/after test/api/sometest.spec.js test/models/somemodel.spec.js ... more here

El archivo helper.js se debe cargar porque contiene helper.js globales para mi conjunto de pruebas. Cuando ejecuto Mocha para ejecutar todo el conjunto de pruebas de esta manera:

mocha --recursive test/

el archivo helper.js se carga antes de mis pruebas y mi gancho before se ejecuta como se esperaba.

Sin embargo, cuando ejecuto solo una prueba específica, helper.js no se carga antes de la prueba. Así es como lo ejecuto:

mocha test/api/sometest.spec.js

No se llama global before , ni siquiera una console.log(''I WAS HERE''); .

Entonces, ¿cómo puedo hacer que Mocha cargue siempre mi archivo helper.js ?


En nuestro proyecto, estamos usando ayudantes de esta manera:

clientHelper = require("../../../utils/clientHelper")

Necesita configurar la ruta relativa de su ayudante correctamente.

Y luego llamándolo así:

clientHelper.setCompanyId(clientId)


Llegué a esta pregunta después de intentar todo tipo de cosas para que mis pruebas se conectaran una vez a una base de datos y luego ejecutaran un montón de pruebas en mis models .

Entonces encontré mocha-prepare que resolvió mis problemas.

En su archivo helper.js solo puede definir una función de prepare .

prepare(done => { console.log(''do something asynchronously here'') done() }, done => { console.log(''asynchronously clean up after here'') done() })

trabaja una golosina


Lo que hago es crear un archivo test/test_helper.js , que exporta todos los ayudantes que creo:

// test/test_helper.js module.exports = { MyHelper: require(''./helpers/MyHelper'') }

Luego require al ayudante en cualquier prueba que necesite para usarla:

// test/spec/MySpec.js var helper = require(''../test_helper''); // Or if you need just "MyHelper" var myHelper = require(''../test_helper'').MyHelper; describe(''MySpec'', function () { // Tests here... });

Prefiero el enfoque anterior porque es fácil de entender y flexible. Puede verlo en acción aquí en mi demostración: https://github.com/paulredmond/karma-browserify-demo/tree/master/test


Mocha no tiene ninguna idea de un archivo especial llamado helper.js que se cargaría antes que otros archivos.

Lo que intentas hacer funciona cuando ejecutas mocha --recursive debido al orden en el que Mocha carga tus archivos. Como helper.js es un nivel más alto que los otros archivos, primero se carga. Cuando especifica un archivo individual a Mocha, Mocha simplemente carga este archivo y, como descubrió, su archivo helper.js no se carga en absoluto.

Entonces, lo que quiere hacer es cargar un archivo tal que establezca ganchos de nivel superior ("global") (por ejemplo, before , after , etc.). Opciones:

  1. Podría usar Mocha mediante programación y alimentarlo con los archivos en el orden que desee.

  2. Podría obligarse a especificar siempre el archivo de ayuda en la línea de comandos antes de enumerar cualquier otro archivo. (No haría esto, pero es posible).

  3. Otra opción sería organizar su suite como he detallado en esta respuesta . Básicamente, tienes un archivo de "nivel superior" que carga el resto de la suite en él. Con este método perdería la capacidad de ejecutar Mocha en archivos individuales, pero podría usar --grep para seleccionar lo que se está ejecutando.

No puedes usar la opción -r . Carga un módulo antes de ejecutar la suite pero, desafortunadamente, el módulo cargado no tiene acceso a ninguna de las interfaces de prueba que Mocha pone a disposición de sus pruebas, por lo que no puede establecer enlaces.


Primero, definitivamente usaría mocha.opts para que no tenga que incluir las opciones que desea cada vez. Como se señaló, una opción es usar --grep , pero no soy un gran fanático de eso personalmente. Se requería que nombraras todo de una manera demasiado simplista. Si el gancho before NO es asíncrono, puede usar --require en sus mocha.opts . p.ej

#mocha.opts --recursive --require test/helpers.js

Suena como que esto no funcionaría para ti porque también quieres un enlace global global. Lo que he hecho es que solo llamo a la prueba completa cada vez, pero si estoy en medio de desarrollo y solo quiero probar una suite, o incluso una prueba específica, uso la función de exclusividad, only https://mochajs.org/#exclusive-tests . Puedes hacerlo it.only(''... o describe.only(''... Si haces esto, examina todas las pruebas y se configura exactamente como lo haría tu arnés de prueba completo, pero luego solo ejecuta la prueba o la suite que han especificado

Ahora puedes incluir esos ganchos globales sin problema. @Louis menciona que sus helpers.js están cargando en el orden correcto solo por coincidencia. Eso no es verdad. Si coloca cualquier enlace fuera de un bloque de describe , automáticamente se convierte en un enlace global. Esto se puede lograr ya sea poniéndolo en su propio archivo

// helpers.js before(function() { console.log(''testing...''); });

o dentro de un archivo de prueba

// some.spec.js before(function() { console.log(''testing...''); }); describe(''Something'', function() { it(''will be tested'', function() { ... }); });

Obviamente, creo que ponerlo en su propio archivo es más limpio. (Lo llamé hooks.js ). El punto es que esto no es el resultado del orden en que se cargaron los archivos.

Solo una respuesta que podría ser obvia para otra pero luché brevemente: los ganchos que no están en un bloque de describe son TODOS globales. No son específicos del directorio. Entonces, si copia helpers.js en un subdirectorio de pruebas, el enganche before y after se disparará dos veces. Además, si coloca un gancho antes de cada uno allí, se disparará antes de cada prueba, no solo las pruebas en ese directorio.

De todos modos, sé que esta publicación es un poco antigua, pero espero que esto ayude a otros a tener problemas similares.