uniendo pruebas de múltiples archivos con mocha.js

Estoy tratando de unir todas las pruebas de varios archivos en un archivo, algo como esto:

describe('Controllers', function() { describe('messages.js', function() { require('./controllertests/messages').test(options); }) describe('users.js', function() { require('./controllertests/users').test(options); }) }) 

Estoy bastante seguro de que esta no es la mejor manera de unirse a las pruebas, tengo algunas dificultades para encontrar ejemplos de cómo hacer esto: s

Si desea incluir varios módulos en su jerarquía de describe como lo está haciendo en su pregunta, lo que está haciendo es prácticamente todo, a menos que desee escribir un cargador de prueba personalizado para Mocha. Escribir el cargador personalizado no sería más fácil o hacer que su código sea más claro que el que ya tiene.

Aquí hay un ejemplo de cómo cambiaría algunas cosas. El subdirectorio de test en este ejemplo está organizado como:

 . └── test ├── a │  └── a.js ├── b │  └── b.js ├── common.js └── top.js 

top.js :

 function importTest(name, path) { describe(name, function () { require(path); }); } var common = require("./common"); describe("top", function () { beforeEach(function () { console.log("running something before each test"); }); importTest("a", './a/a'); importTest("b", './b/b'); after(function () { console.log("after all tests"); }); }); 

La función importTest es solo para mostrar cómo sería posible manejar la repetición de la importación de múltiples módulos sin tener que volver a escribir todo lo describe(... require... cada vez. El módulo common está destinado a contener lo que necesita para usar en múltiples módulos de la suite de prueba. No lo uso en realidad en la top pero podría usarse allí, si es necesario.

beforeEach aquí que beforeEach ejecutará su código antes de cada prueba registrada, it sea ​​que aparezcan dentro de la describe en la top o en cualquiera de los módulos importados . Con --recursive , el código beforeEach tendría que copiarse en cada módulo o tal vez tendría un beforeEach en cada módulo que llama a una función importada desde un módulo común.

Además, el enganche after se ejecutará después de todas las pruebas en la suite. Esto no puede ser replicado con --recursive . Si usa --recursive y agrega el código de after a cada módulo, se ejecutará una vez por módulo en lugar de solo una vez para toda la prueba.

Hacer que todas las pruebas aparezcan bajo un solo encabezado top no se puede replicar utilizando --recursive . Con --recursive cada archivo podría haber sido describe("top" pero esto crearía un nuevo encabezado top para cada archivo).

common.js :

 var chai = require("chai"); var options = { foo: "foo" }; exports.options = options; exports.chai = chai; exports.assert = chai.assert; 

El uso de un módulo con este nombre en common es algo que he hecho en algunas de mis suites de prueba para evitar tener que require un montón de cosas una y otra vez y para mantener variables globales de solo lectura o funciones que no mantienen el estado. Prefiero no contaminar el objeto global como en la respuesta de thgaskell porque este objeto es verdaderamente global y accesible incluso en bibliotecas de terceros que su código puede estar cargando. Esto no es algo que encuentre aceptable en mi código.

a/a.js :

 var common = require("../common"); var options = common.options; var assert = common.assert; it("blah a", function () { console.log(options.foo); assert.isTrue(false); }); 

b/b.js :

 it("blah b", function () {}); 

Si bien esto puede no estar directamente relacionado con la pregunta, la respuesta que estaba buscando era:

 $ mocha --recursive 

Ejecutará todas las pruebas en los subdirectorios de la carpeta “prueba”. Ordenado. Ahorra tener que mantener una lista de pruebas que quiero cargar y en realidad siempre ejecuto todo.

No hay nada que le impida ejecutar varios archivos de prueba. En general, cada prueba no debe depender de los resultados de otra prueba, por lo que compartir variables no es algo que querría hacer.

Aquí hay un ejemplo de cómo podría organizar sus archivos de prueba.

 . ├── app.js └── test ├── common.js ├── mocha.opts │ ├── controllers │  ├── messages-controller.js │  └── users-controller.js │ └── modles ├── messages-model.js └── users-model.js 

Luego, dentro de su archivo mocha.opts , asegúrese de configurar la opción --recursive .

mocha.opts

 --ui bdd --recursive 

Si hay módulos comunes que desea incluir en todos los archivos, puede agregarlos al archivo common.js . Los archivos en la raíz del directorio de test se ejecutarán antes que los archivos en directorios nesteds.

common.js

 global.chai = require('chai'); global.assert = chai.assert; global.expect = chai.expect; chai.should(); chai.config.includeStack = true; process.env.NODE_ENV = 'test'; // Include common modules from your application that will be used among multiple test suites. global.myModule = require('../app/myModule'); 

Sé que este es un post antiguo, pero quería dar una idea de lo que ha sido una buena solución para mí, muy similar al método propuesto por OP.

El proyecto en el que estoy trabajando está bien probado y las pruebas siguen creciendo. Terminé usando require porque es síncrono y, por lo tanto, hace que sea un poco más fácil redactar tus pruebas sin demasiados cambios en la architecture:

 // inside test/index.js describe('V1 ROUTES', () => { require('./controllers/claims.test'); require('./controllers/claimDocuments.test'); require('./controllers/claimPhotos.test'); require('./controllers/inspections.test'); require('./controllers/inspectionPhotos.test'); require('./controllers/versions.test'); require('./services/login.v1.test'); }); describe('V2 ROUTES', () => { require('./services/login.v2.test'); require('./services/dec-image.v2.test'); }); describe('V3 ROUTES', () => { require('./services/login.v3.test'); require('./services/getInspectionPhotosv3.test'); require('./services/getPolicyInfo.v3.test'); }); describe('ACTIONS', () => { require('./actions/notifications.test'); }); 
 describe( 'Running automation test, Please wait for all test to complete!'.red, function () { var run = require( './Test.js' ); for ( var i = 0; i < 2; i++ ) { run.badLogin(); run.loginLimited(); run.acceptJob(); run.drivingToJob(); run.arrivedAtJob(); run.towingJob(); run.arrivedDestination(); run.jobComplete(); run.restrictionLicensePlate(); run.newNodeMainMenu(); run.newNodeMainMenuToDrafts(); run.draftDelete(); run.resetAllData(); run.companyVehicle(); run.actionsScreenClockInOut(); run.mainMenuLogout(); run.loginAdmin(); run.actionsScreenLogout(); } } );