Tengo problemas para que Chai expect.to.throwfuncione en una prueba para mi aplicación node.js. La prueba sigue fallando en el error arrojado, pero si envuelvo el caso de prueba en try y catch y afirmo sobre el error capturado, funciona.
¿ expect.to.throwNo funciona como creo que debería o algo así?
it('should throw an error if you try to get an undefined property', function (done) {
var params = { a: 'test', b: 'test', c: 'test' };
var model = new TestModel(MOCK_REQUEST, params);
// neither of these work
expect(model.get('z')).to.throw('Property does not exist in model schema.');
expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
// this works
try {
model.get('z');
}
catch(err) {
expect(err).to.eql(new Error('Property does not exist in model schema.'));
}
done();
});
La falla:
19 passing (25ms)
1 failing
1) Model Base should throw an error if you try to get an undefined property:
Error: Property does not exist in model schema.
fuente

modelLa instancia tiene una función llamada get que pasé / invoqué en wait.to.throwes probar una condición particular dentro de una función, que requiere llamar a esa función con el estado / argumentos inválidos. (Para el caso ... ¿por qué los enlaces profundos de chaijs.com realmente no lo hacen?)Como dice esta respuesta , también puede envolver su código en una función anónima como esta:
fuente
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);ya que no hay un método de notificación.catch (err) { expect(err).equal('Error message to be checked'); done(); }thisdentro de la función que se llamará. Entonces.bindes el camino correcto a seguir.Y si ya está utilizando ES6 / ES2015, también puede utilizar una función de flecha. Básicamente es lo mismo que usar una función anónima normal pero más corta.
fuente
thisthisdel ámbito en el que se crearon. A menudo, esto puede ser una ventaja, ya que evita la necesidadbindde incorporar funciones a suthisobjeto manualmente.bindy siempre se une althisalcance principal. Mi intención en el comentario era solo asegurar que los lectores estuvieran al tanto de una posible caída en boxes.Esta pregunta tiene muchos, muchos duplicados, incluidas preguntas que no mencionan la biblioteca de afirmaciones Chai. Aquí están los elementos básicos recopilados juntos:
La aserción debe llamar a la función, en lugar de evaluarla inmediatamente.
Puede verificar errores específicos utilizando cualquier biblioteca de aserciones:
Nodo
Debería
Chai esperar
Debe manejar las excepciones que 'escapan' de la prueba
Esto puede parecer confuso al principio. Al igual que andar en bicicleta, solo hace clic para siempre una vez que hace clic.
fuente
ejemplos de doc ...;)
porque confías en el
thiscontexto:tienes que usar una de estas opciones:
atar el contexto
fuente
Otra posible implementación, más engorrosa que la solución .bind (), pero que ayuda a hacer el punto de que esperar () requiere una función que proporcione un
thiscontexto a la función cubierta, puede usar uncall(), por ejemplo,expect(function() {model.get.call(model, 'z');}).to.throw('...');fuente
He encontrado una buena forma de evitarlo:
Es mucho más legible que mi versión anterior:
fuente