Tengo problemas para que Chai expect.to.throw
funcione 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.throw
No 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
model
La instancia tiene una función llamada get que pasé / invoqué en wait.to.throw
es 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(); }
this
dentro de la función que se llamará. Entonces.bind
es 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
this
this
del ámbito en el que se crearon. A menudo, esto puede ser una ventaja, ya que evita la necesidadbind
de incorporar funciones a suthis
objeto manualmente.bind
y siempre se une althis
alcance 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
this
contexto: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
this
contexto 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