Tengo una función de devolución de llamada en la before()
que es para limpiar la base de datos. ¿Está todo before()
garantizado para terminar antes de que it()
comience?
before(function(){
db.collection('user').remove({}, function(res){}); // is it guaranteed to finish before it()?
});
it('test spec', function(done){
// do the test
});
after(function(){
});
javascript
asynchronous
mocha
Nicolas S.Xu
fuente
fuente
before
controlador. Por ejemplobefore(function () { return db.collection...}
Respuestas:
Para nuevas versiones de moca:
Ahora puede devolver una promesa a mocha, y mocha esperará a que se complete antes de continuar. Por ejemplo, se aprobará la siguiente prueba:
let a = 0; before(() => { return new Promise((resolve) => { setTimeout(() => { a = 1; resolve(); }, 200); }); }); it('a should be set to 1', () => { assert(a === 1); });
Puedes encontrar la documentación aquí
Para versiones antiguas de moca:
Si desea que su solicitud asincrónica se complete antes de que suceda todo lo demás, debe usar el
done
parámetro en su solicitud anterior y llamarlo en la devolución de llamada.Mocha esperará entonces hasta que
done
sea llamado para comenzar a procesar los siguientes bloques.before(function (done) { db.collection('user').remove({}, function (res) { done(); }); // It is now guaranteed to finish before 'it' starts. }) it('test spec', function (done) { // execute test }); after(function() {});
Sin embargo, debe tener cuidado, ya que no copiar la base de datos para las pruebas unitarias puede ralentizar mucho la ejecución, ya que las solicitudes en una base de datos pueden ser bastante largas en comparación con la ejecución de código simple.
Para obtener más información, consulte la documentación de Mocha .
fuente
done
. Solo devuelve una promesa.before(function () { return db.collection('user').remove({}); })
dado queremove()
devuelve una promesa, no es necesario envolverla en unnew Promise()
Con suerte, su db.collection () debería devolver una promesa. Si es así, también puede usar la palabra clave async en before ()
// Note: I am using Mocha 5.2.0. before(async function(){ await db.collection('user').remove({}, function(res){}); // it is now guaranteed to finish before it() });
fuente
after()
? Miawait
funciona bien cuando lo llamobefore()
(elimina una entrada de DB), pero si pongo exactamente lo mismoafter()
, no elimina nada para cuandodescribe()...it()
comienza un segundo y falla debido a que los datos no se eliminan.