unitarios tutorial test nodejs moca español comandos javascript node.js mocha

javascript - tutorial - ¿Cómo puedo ejecutar pruebas asíncronas de Mocha(NodeJS) en orden?



tdd nodejs (4)

El punto no es tanto que "el código estructurado se ejecuta en el orden en que lo has estructurado" (¡asombra!), Sino que, como sugiere @chrisdew, no se pueden garantizar los pedidos de devolución para las pruebas asíncronas. Para replantear el problema, las pruebas que se encuentran más abajo en la cadena (ejecución síncrona) no pueden garantizar que las condiciones requeridas, establecidas por las pruebas asíncronas, estarán listas para cuando se ejecuten.

Por lo tanto, si requiere que se establezcan ciertas condiciones en las primeras pruebas (como un token de inicio de sesión o similar), tiene que usar ganchos como before() probar que esas condiciones se establecen antes de continuar.

Envuelva las pruebas dependientes en un bloque y ejecute un async before engancharlas (observe el ''hecho'' en el bloque anterior):

var someCondition = false // ... your Async tests setting conditions go up here... describe(''is dependent on someCondition'', function(){ // Polls `someCondition` every 1s var check = function(done) { if (someCondition) done(); else setTimeout( function(){ check(done) }, 1000 ); } before(function( done ){ check( done ); }); it(''should get here ONLY once someCondition is true'', function(){ // Only gets here once `someCondition` is satisfied }); })

Esta pregunta se relaciona con el marco de pruebas Mocha para NodeJS.

El comportamiento predeterminado parece ser iniciar todas las pruebas y luego procesar las devoluciones de llamada asíncronas a medida que se realizan.

Al ejecutar pruebas asíncronas, me gustaría ejecutar cada prueba después de que se haya llamado la parte asíncrona de la anterior.

¿Cómo puedo hacer esto?


Estoy sorprendido por lo que escribiste mientras uso. Utilizo mocha con pruebas de estilo bdd (describí / it), y solo agregué algunos console.logs a mis pruebas para ver si sus reclamos se mantienen con mi caso, pero aparentemente no lo hacen.

Aquí está el fragmento de código que he usado para ver el orden de "end1" y "start1". Fueron debidamente ordenados.

describe(''Characters start a work'', function(){ before(function(){ sinon.stub(statusapp, ''create_message''); }); after(function(){ statusapp.create_message.restore(); }); it(''creates the events and sends out a message'', function(done){ draftwork.start_job(function(err, work){ statusapp.create_message.callCount.should.equal(1); draftwork.get(''events'').length.should.equal( statusapp.module(''jobs'').Jobs.get(draftwork.get(''job_id'')).get(''nbr_events'') ); console.log(''end1''); done(); }); }); it(''triggers work:start event'', function(done){ console.log(''start2''); statusapp.app.bind(''work:start'', function(work){ work.id.should.equal(draftwork.id); statusapp.app.off(''work:start''); done(); });

Por supuesto, esto también podría haber ocurrido por accidente, pero tengo muchas pruebas, y si se ejecutaran en paralelo, definitivamente tendría condiciones de carrera, que no tengo.

Por favor, consulte este problema también en el rastreador de problemas mocha. Según él, las pruebas se ejecutan de forma síncrona.


Quería resolver este mismo problema con nuestra aplicación, pero la respuesta aceptada no funcionó bien para nosotros. Especialmente en someCondition caso, nunca sería cierto.

Usamos promesas en nuestra aplicación y esto hizo que sea muy fácil estructurar las pruebas en consecuencia. Sin embargo, la clave aún es retrasar la ejecución a través del enlace before :

var assert = require( "assert" ); describe( "Application", function() { var application = require( __dirname + "/../app.js" ); var bootPromise = application.boot(); describe( "#boot()", function() { it( "should start without errors", function() { return bootPromise; } ); } ); describe( "#shutdown()", function() { before( function() { return bootPromise; } ); it( "should be able to shut down cleanly", function() { return application.shutdown(); } ); } ); } );


usar mocha-steps

mantiene las pruebas secuenciales independientemente de si son asíncronas o no (es decir, las funciones done todavía funcionan exactamente como lo hicieron). Es un reemplazo directo para it y en su lugar usas step