assert.throws en método asíncrono

Estoy teniendo problemas tratando de usar assert.throws en mis pruebas de unidades Mocha,

Tengo este método:

var getMetadatas = function (file, callback) { fs.readFile(file, {encoding: 'utf-8'}, function(err, data){ // stuff if (somethingWentWrong) throw new Error('Something went wrong') // callback call }) } 

Y en mis pruebas unitarias tengo:

 it('should throw an error when passing a bad formatted file', function(){ assert.throws( getMetadatas('someBadFormattedFile', function(metadatas){}) ) }) 

Los resultados que obtengo son aleatorios, a veces se produce el error (obtuve un Uncaught Error: something went wrong ) y la prueba falla, a veces pasa.

He intentado un par de otras cosas, como pasar el error a través de la callback y hacer:

 var fn = function(){ parse.getMetadatas('test/test_incorrect.md', function (err, metas) { if (err) throw err }) } assert.throws( function() { fn() }, Error ) 

Y obtuve como resultado: AssertionError: Missing expected exception (Error).. así que supongo que no ve nada …

La única forma en que puedo hacer que assert.throws funcione como esperaba es con una función síncrona:

 assert.throws( function () {throw new Error('error')} ) 

Me preguntaba si tenía que hacer algo con done() , pero aún así, llamándolo en mi callback, no tuve éxito. ¿Me he perdido algo?

Este es el código correcto

 var fn = function(){ parse.getMetadatas('test/test_incorrect.md', function (err, metas) { if (err) throw err }) } assert.throws( function() { fn() }, Error ) 

El mensaje

 AssertionError: Missing expected exception (Error).. 

dice que el tipo equivocado de excepción fue lanzado. No dice qué aseveración está utilizando, pero presumiblemente el ‘Error’ en el assert.throws especifica qué tipo de excepción se espera. Debe cambiarlo para que coincida con la excepción real que se produce.

Supongo que también es posible que el mensaje diga que no se lanzó ninguna excepción. Tendrá que revisar la documentación de su biblioteca o escribir una prueba simple para verificar qué está mal.

Logré que funcionara mejorando la respuesta de David Norman. Como dije en mi pregunta, a mi prueba le faltó la llamada done() , pero incluso si la estaba llamando después del throw err , estaba teniendo una excepción de tiempo de espera con Mocha. De todos modos, este es el fragmento de código que usé para la prueba de otro método asíncrono que escribí, y pasa y no recibe un error de tiempo de espera:

 var fn = function () { fs.rmrf(path.join(pathDir, 'non', 'existing'), function (err) { done() assert.ifError(err) }) } assert.throws(function () { fn() } , /No directory/) 

Donde /No directory/ coincide con la descripción de texto del error que se produce en la callback de fn . Podría ser un Error pero quería estar seguro de assert.throws error estaba detectando assert.throws .

Intereting Posts