2011-07-11 9 views
24

Teniendo en cuenta este código:¿La afirmación del nodo está completamente rota?

var assert = require('assert'); 

function boom(){ 
    throw new Error('BOOM'); 
} 

assert.throws(boom(), Error); 

consigo esta salida, con el nodo 0.4.9:

node.js:134 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^
Error: BOOM 
    at boom ([EDITED]/assert.throws.test.js:4:9) 
    at Object.<anonymous> ([EDITED]/assert.throws.test.js:7:17) 
    at Module._compile (module.js:402:26) 
    at Object..js (module.js:408:10) 
    at Module.load (module.js:334:31) 
    at Function._load (module.js:293:12) 
    at Array.<anonymous> (module.js:421:10) 
    at EventEmitter._tickCallback (node.js:126:26) 

Esto, para mí, significa que se ha producido una excepción no capturada, a diferencia de un comunicado, atrapado excepción. Buscando en la documentación, noto que los ejemplos se parecen más a esto:

var assert = require('assert'); 

function boom(){ 
    throw new Error('BOOM'); 
} 

assert.throws(boom, Error); 

Pero ¿Cómo se prueba si se produce una excepción dada una cierta entrada? Por ejemplo:

var assert = require('assert'); 

function boom(blowup){ 
    if(blowup) 
     throw new Error('BOOM'); 
} 

assert.throws(boom, Error); 

Esto no funcionará. ¿Qué estoy haciendo mal o qué secreto conocen todos excepto yo?

Respuesta

50

Los ejemplos toman una función, mientras que su código de muestra llama a una función y pasa el resultado. La excepción ocurre antes de que la afirmación llegue a mirarla.

cambiar el código para esto:

var assert = require('assert'); 

function boom(){ 
    throw new Error('BOOM'); 
} 

assert.throws(boom, Error); // note no parentheses 

EDIT: Para pasar parámetros, basta con otra función. ¡Después de todo, esto es javascript!

var assert = require('assert'); 

function boom(blowup){ 
    if(blowup) 
     throw new Error('BOOM'); 
} 

assert.throws(function() { boom(true); }, Error); 
+0

Esto es lo que demuestra mi segundo ejemplo. Esto tiene sentido, porque necesita llamar a la función de prueba en un entorno controlado. Pero, ¿y si la función requiere entrada para lanzar una excepción, como mi tercer ejemplo? – Andrew

+0

Bueno, haz lo que javascript es bueno en: creando nuevas funciones, como en mi edición –

+0

Ah, ahora entiendo. ¡Gracias! – Andrew

7

Puede usar bind():

assert.throws(boom.bind(null), Error); 

Con argumentos es:

assert.throws(boom.bind(null, "This is a blowup"), Error); 
6

nodo actual estable (v4.1) incluye la función de apoyo flecha grasa por defecto (sin --harmony bandera requerida) por lo que puede hacer algo como:

assert.throws(()=>boom(), Error); 
assert.throws(()=>boom(true), Error); // with params 

Incluso si tiene paréntesis después de boom() (por lo que en realidad lo está invocando, en lugar de pasar una referencia al objeto de función), usando la función de flecha fat está envolviéndolo en un bloque, que es lo que assert.throws espera.

Cuestiones relacionadas