La siguiente prueba se comporta de manera extraña:
it('Should return the exchange rates for btc_ltc', function(done) {
var pair = 'btc_ltc';
shapeshift.getRate(pair)
.then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
done();
})
.catch(function(err){
//this should really be `.catch` for a failed request, but
//instead it looks like chai is picking this up when a test fails
done(err);
})
});
¿Cómo debo manejar adecuadamente una promesa rechazada (y probarla)?
¿Cómo debo manejar adecuadamente una prueba fallida (es decir expect(data.rate).to.have.length(400);
:?
Aquí está la implementación que estoy probando:
var requestp = require('request-promise');
var shapeshift = module.exports = {};
var url = 'http://shapeshift.io';
shapeshift.getRate = function(pair){
return requestp({
url: url + '/rate/' + pair,
json: true
});
};
Ensure the done() callback is being called in this test
error al intentar hacer esto con mocha 2.2.5.done
parámetro en elit
que optaría por no participar.done
en miit
devolución de llamada y llamar explícitamentereturn
(en la promesa) en la devolución de llamada es cómo lo hice funcionar, al igual que en el fragmento de código.Alternately, instead of using the done() callback, you may return a Promise. This is useful if the APIs you are testing return promises instead of taking callbacks:
done
parámetro a lait
llamada, y esto todavía está sucediendo ...Como ya se señaló aquí , las versiones más nuevas de Mocha ya son compatibles con Promise. Pero dado que el OP preguntó específicamente sobre Chai, es justo señalar el
chai-as-promised
paquete que proporciona una sintaxis limpia para probar las promesas:usando chai-como-prometió
Aquí le mostramos cómo puede usar chai-as-prometido para probar ambos
resolve
y losreject
casos para una promesa:sin chai-como-prometido
Para dejar realmente claro lo que se está probando, aquí está el mismo ejemplo codificado sin chai-como-prometió:
fuente
catch
se invoca cuando uno de losexpect(s)
errores. Esto da una impresión equivocada de que la promesa falló aunque no lo hizo. Es solo la expectativa que falló.Chai.use
para montarlo. Nunca lo habría recogido de la documentación que tenían. | :(Aquí está mi opinión:
async/await
Una función de promesa retrasada, que falla, si se le da un retraso de 0:
La prueba positiva es bastante simple. La falla inesperada (simulación por
500→0
) fallará la prueba automáticamente, a medida que la promesa rechazada se intensifique.La prueba negativa usa la idea try-catch-idea. Sin embargo: 'quejarse' sobre un pase no deseado ocurre solo después de la cláusula catch (de esa manera, no termina en la cláusula catch (), lo que desencadena más errores pero engañosos.
Para que esta estrategia funcione, uno debe devolver la prueba de la cláusula catch. Si no quieres probar nada más, usa otro bloque it ().
fuente
Hay una mejor solución. Simplemente devuelva el error con hecho en un bloque catch.
esta prueba fallará con el siguiente mensaje:
AssertionError: expected 1 to equal 11
fuente