Me sorprende lo que escribiste mientras uso. Uso mocha con las pruebas de estilo bdd (describe/it), y acabo de agregar algunos console.logs a mis pruebas para ver si tus afirmaciones son válidas en mi caso, pero aparentemente no es así.
Aquí está el fragmento de código que he usado para ver el orden de "end1" y "start1". Fueron ordenados apropiadamente.
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 podría haber sucedido por casualidad también, pero tengo un montón de pruebas, y si iban a ejecutar en paralelo, sin duda lo que las condiciones de carrera, que yo no tengo.
Consulte también this issue desde el rastreador de problemas de mocha. Según él, las pruebas se ejecutan sincrónicamente.
¿Cómo cambiaría 'someCondition' alguna vez si la devolución de llamada anterior está bloqueada en un ciclo while? Esta no es la forma en que funciona JavaScript. – natevw
La respuesta a su pregunta se encuentra en la línea de comentario 3: "... aquí suben las condiciones de configuración de las pruebas Async". Específicamente: Async, condiciones de configuración, con alcance fuera de 'describe()' que crea una instancia antes de 'antes()'. Su última afirmación de que Javascript no funciona de esta manera es falsa. – papercowboy
Mientras su código se bloquea varias veces comprobando! AlgunaCondición una y otra vez, no se puede ejecutar ninguno de sus otros códigos. (Todas las otras devoluciones de llamada asociadas con eventos/temporizadores se impedirán de ejecutarse.) La única forma en que esto funcionaría es si alguna Condición se establece como verdadera antes de que comience el ciclo; de lo contrario, se bloqueará. Intentalo. – natevw