Estoy tratando de unir todas las pruebas de varios archivos en un solo 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 unirme a pruebas, tengo algunas dificultades para encontrar ejemplos de cómo hacer esto: s
node.js
unit-testing
mocha
coiso
fuente
fuente
.only()
, podría ser útil poder ponerdescribe.only()
en ejecución un directorio completo de pruebas. Eso es lo que me trajo aquí.Respuestas:
Si desea incluir varios módulos en su
describe
jerarquía como lo está haciendo en su pregunta, lo que está haciendo es prácticamente eso , a menos que desee escribir un cargador de prueba personalizado para Mocha. Escribir el cargador personalizado no sería más fácil ni haría su código más claro de lo que ya tiene.Aquí hay un ejemplo de cómo cambiaría algunas cosas. El
test
subdirectorio en este ejemplo está organizado como: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
importTest
función es solo para mostrar cómo sería posible manejar la repetición de la importación de varios módulos sin tener que volver a escribir tododescribe(... require...
cada vez. Elcommon
módulo está destinado a contener lo que necesita usar en varios módulos del conjunto de pruebas. En realidad, no lo estoy usando,top
pero podría usarse allí, si es necesario.Voy a señalar aquí que la
beforeEach
va a ejecutar su código antes de cada prueba única registrada conit
si aparecen dentro de ladescribe
entop
, o que aparecen en cualquiera de los módulos importados . Con--recursive
, elbeforeEach
código tendría que copiarse en cada módulo o tal vez tendría unbeforeEach
gancho en cada módulo que llama a una función importada de un módulo común.Además, el
after
gancho se ejecutará después de todas las pruebas en la suite. Esto no se puede replicar con--recursive
. Si usa--recursive
y agrega el código deafter
a cada módulo, se ejecutará una vez por módulo en lugar de solo una vez para toda la prueba.El hecho de que todas las pruebas aparezcan bajo un solo
top
encabezado no se puede replicar con--recursive
. Con--recursive
cada archivo podría haberlo hecho,describe("top"
pero esto crearía un nuevotop
encabezado 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
así es algo que he hecho en algunas de mis suites de prueba para evitar tener que hacerrequire
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 elglobal
objeto como en la respuesta de thgaskell porque este objeto es verdaderamente global y accesible incluso en bibliotecas de terceros, 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 () {});
fuente
global
alcance, lo uso para las bibliotecas de aserción para mantener más limpios los archivos de prueba. No es como si estuvieras sobrescribiendoglobal.process
. Las variables locales se anularán aglobal
menos que otras bibliotecas llamen explícitamente, loglobal.XYZ
cual es poco probable. Solo dura la duración de las pruebas. No me ha hecho daño todavía, pero te lo haré saber en el momento en que me muerda el culo :)importTest
y llamar,require('path')()
por ejemplo?importTest
función es solo una función de conveniencia. Lo importante que hace es envolver larequire
llamada en undescribe
bloque. Es importante que larequire
llamada se envuelva, de lodescribe
contrario, los módulos no se aislarán en su propio bloque y cualquier enlace establecido por el archivo importado se establecerá en el bloque incorrecto. SiimportTest
se reemplazó con una llamada directa arequire
sin un ajustedescribe
, entonces los módulosa/a
yb/b
compartirían ganchos. Por ejemplo, unbeforeEach
gancho establecidob/b
también se ejecutaría antes de cada prueba ena/a
.Aunque esto puede no estar directamente relacionado con la pregunta, la respuesta que estaba buscando era:
Ejecutará todas las pruebas en subdirectorios de la carpeta "prueba". Ordenado. Me ahorra tener que mantener una lista de pruebas que quiero cargar y, en realidad, siempre ejecutarlo todo.
fuente
describe
bloques, losdescribe
bloques que abarcan archivos--recursive
no lo harán. Dado que no resuelve el problema del OP, no lo llamaría "mejor".describe
bloquesdescribe
bloque. Mira la pregunta. Eldescribe
bloque "Controladores" debe abarcar las pruebas de./controllertests/messages.js
y./controllertests/users.js
. Dar--recursive
una palmada en una invocación de Mocha no crea mágicamente undescribe("Controllers"
bloqueo.describe
bloques mágicamente , lo cual aprendí a hacer del mismo Dumbledore.No hay nada que le impida ejecutar varios archivos de prueba. Generalmente, cada prueba no debe depender de los resultados de otra prueba, por lo que compartir variables no es algo que le gustaría hacer.
Este es un ejemplo de cómo podría organizar sus archivos de prueba.
Entonces dentro de tu
mocha.opts
archivo, asegúrese de configurar la--recursive
opción.mocha.opts
Si no están módulos comunes que desea incluir en todos los archivos, se puede añadir que el
common.js
archivo. Los archivos en la raíz deltest
directorio se ejecutarán antes que los archivos en directorios anidados.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');
fuente
describe('mytest', function() { /* ..... etc */ });
Sé que esta es una publicación antigua, 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'); });
fuente
Tuve un problema similar en el que tenía un montón de pruebas para clases en la misma categoría y quería agruparlas para facilitar su visualización en un IDE. Todas mis pruebas y código ya usaban módulos ES6; no quería reescribirlos todos para usarlos
require
como vi en otros ejemplos.Lo resolví
describe
exportando mi "agrupación" y luego importándolo a mis archivos de prueba y agregándolos programáticamente al archivo importadodescribe
. Terminé creando un método auxiliar para abstraer todas las tuberías.En someCategory.spec.js
const someCategory= describe("someCategory", () => {}); // Use this just like a regular `describe` to create a child of this scope in another file export default function describeMember(skillName, testFn) { return describe(skillName, function configureContext() { // Make context a child of `someCategory` context function Context() {} Context.prototype = someCategory.ctx; this.ctx = new Context(); // Re-parent the suite created by `describe` above (defaults to root scope of file it was created in) this.parent.suites.pop(); someCategory.addSuite(this); // Invoke the fn now that we've properly set up the parent/context testFn.call(this); }); }
En pruebas individuales:
import { default as describeCategoryMember } from './someCategory.spec'; describeCategoryMember('something', () => { describe('somethingElse', () => { ... }); it('a test', () => { ... }); })
fuente
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(); } } );
fuente
./Test.js
? ¿Quién sabe? Para que conste, actualmente soy el principal respondedor en la etiqueta mocha . Conozco a Mocha por dentro y por fuera, pero no puedo entender esta respuesta.