Tengo la siguiente prueba:
it.only('validation should fail', function(done) { var body = { title: "dffdasfsdfsdafddfsadsa", description: "Postman Description", beginDate: now.add(3, 'd').format(), endDate: now.add(4, 'd').format() } var rules = eventsValidation.eventCreationRules(); var valMessages = eventsValidation.eventCreationMessages(); indicative .validateAll(rules, body, valMessages) .then(function(data) { console.log("SHOULD NOT GET HERE"); should.fail("should not get here"); done(); }) .catch(function(error) { console.log("SHOULD GET HERE"); console.log(error); }); done(); });La ruta de ejecución de la prueba es correcta. Cuando tengo datos de validación, va a "NO DEBE LLEGAR AQUÍ". La prueba es realmente para asegurarse de que no lo haga. Y cuando introduzco datos que no son de validación, el código va a "DEBERÍA LLEGAR AQUÍ". Entonces las reglas de validación funcionan.
Lo que estoy tratando de hacer es asegurarme de que la prueba falle cuando tengo datos de validación incorrectos y valida. Sin embargo, cuando lo ejecuto tal como está con buenos datos, valida, ejecuta el error, pero Mocha aún lo marca como el paso. Quiero que falle si la ejecución llega a "NO DEBE LLEGAR AQUÍ".
Intenté arrojar un nuevo error ("fallo"); también sin suerte. En ambos casos, parece que también ejecuta el código en el bloque .catch.
¿Alguna sugerencia? Encontré soluciones para esto en una pregunta similar . Esta pregunta está escrita porque esas soluciones no parecen funcionar para mí.
Puede llamar a assert.fail :
it("should return empty set of tags", function() { assert.fail("actual", "expected", "Error message"); }); Además, Mocha considera que la prueba ha fallado si llamas a la función done() con un parámetro.
Por ejemplo:
it("should return empty set of tags", function(done) { done(new Error("Some error message here")); });Aunque el primero me parece más claro.
En ES2017 async / await world chai-as-promised no es tan necesario. Aunque los rechazos simples son un lugar donde chai-as-promised sigue siendo un poco más ordenado de usar.
Se requiere una catch si desea probar el error con más detalle.
it.only('validation should fail', async function(){ let body = { ... } let rules = eventsValidation.eventCreationRules() let valMessages = eventsValidation.eventCreationMessages() try { await indicative.validateAll(rules, body, valMessages) } catch (error) { expect(error).to.be.instanceOf(Error) expect(error.message).to.match(/Oh no!/) return } expect.fail(null, null, 'validateAll did not reject with an error') // or throw new Error('validateAll did not reject with an error') }) async / await requiere Node.js 7.6+ o un compilador como Babel
Use chai-as-promised , con controladores de promesa nativos de Mocha.
var chai = require('chai').use(require('chai-as-promised')); var should = chai.should(); // This will enable .should for promise assertions Ya no es necesario que done , simplemente devuelva la promesa.
// Remove `done` from the line below it.only('validation should fail', function(/* done */) { var body = { title: "dffdasfsdfsdafddfsadsa", description: "Postman Description", beginDate: now.add(3, 'd').format(), endDate: now.add(4, 'd').format() } var rules = eventsValidation.eventCreationRules(); var valMessages = eventsValidation.eventCreationMessages(); // Return the promise return indicative .validateAll(rules, body, valMessages) .should.be.rejected; // The test will pass only if the promise is rejected // Remove done, we no longer need it // done(); });