unir pruebas de varios 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, estoy teniendo algunas dificultades para encontrar ejemplos de cómo hacer esto: s

Author: coiso, 2014-06-11

5 answers

Si desea incluir varios módulos en su jerarquía describe como lo está haciendo en su pregunta, lo que está haciendo es básicamente , 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 de lo que ya tiene.

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

.
└── 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 importar múltiples módulos sin tener que volver a escribir todo describe(... require... cada vez. El módulo common está destinado a contener lo que necesita usar en varios módulos del conjunto de pruebas. En realidad no lo estoy usando en top pero podría usarse allí, si es necesario.

Observaré aquí que el beforeEach ejecutará su código antes de todos y cada uno prueba registrada con it si aparecen dentro de la {[5] {} en[11]} o aparecen 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 gancho beforeEach en cada módulo que llama a una función importada desde un módulo común.

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

El hecho de que todas las pruebas aparezcan bajo un único encabezado top no puede replicarse utilizando --recursive. Con --recursive cada archivo podría tener 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;

Usar un módulo llamado common como esto es algo que he hecho en algunos de mis conjuntos de pruebas para evitar tener que require un montón de cosas una y otra vez y mantener variables o funciones globales de solo lectura 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 pueda 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 () {});
 85
Author: Louis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-07 00:16:06

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

$ mocha --recursive

Ejecutará todas las pruebas en subdirectorios de la carpeta "test". Ordenado. Ahorra tener que mantener una lista de pruebas que quiero cargar y en realidad solo siempre ejecutar todo.

 19
Author: Ian Jamieson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 18:42:10

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 quieras 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 establecer la opción --recursive.

Mocha.opts

--ui bdd
--recursive

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

Común.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');
 13
Author: thgaskell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-06 12:08:36

Sé que este es un post antiguo, pero quería intervenir con 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 sincrónico y, por lo tanto, hace que sea un poco más fácil componer sus pruebas sin demasiados cambios en la arquitectura:

// 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');
});
 3
Author: Mike Fleming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-15 14:19:45
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();
    }
} );
 -8
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-01 14:45:24