J'ai le test suivant:
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();
});
Le chemin d'exécution du test est correct. Lorsque j'ai des données de validation, cela passe à "NE DEVRAIT PAS OBTENIR ICI". Le test est vraiment de s'assurer que ce n'est pas le cas. Et lorsque je mets des données non validantes, le code passe à "DEVRAIT OBTENIR ICI". Les règles de validation fonctionnent donc.
Ce que j'essaie de faire, c'est de m'assurer que le test échoue lorsque j'ai de mauvaises données de validation et qu'il valide. Cependant, lorsque je l'exécute tel quel avec de bonnes données, il valide, exécute l'échec, mais mocha le marque toujours comme étant le passage. Je veux qu'il échoue si l'exécution arrive à "NE DEVRAIT PAS OBTENIR ICI".
J'ai essayé de lancer une nouvelle erreur ("échec"); ainsi sans chance. Dans les deux cas, il semble également exécuter le code dans le bloc .catch.
Aucune suggestion? J'ai trouvé des solutions pour cela dans une question similaire . Cette question est écrite parce que ces solutions ne semblent pas fonctionner pour moi.
Utilisation chai-as-promised
, avec des gestionnaires de promesses natifs Mocha.
var chai = require('chai').use(require('chai-as-promised'));
var should = chai.should(); // This will enable .should for promise assertions
Vous n'avez plus besoin de done
, renvoyez simplement la promesse.
// 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();
});
Vous pouvez appeler assert.fail
:
it("should return empty set of tags", function()
{
assert.fail("actual", "expected", "Error message");
});
En outre, Mocha considère que le test a échoué si vous appelez la fonction done()
avec un paramètre.
Par exemple:
it("should return empty set of tags", function(done)
{
done(new Error("Some error message here"));
});
Bien que le premier me semble plus clair.
Dans l'ES2017 async
/ await
world chai-as-promised
n'est pas autant nécessaire. Bien que les rejets simples soient un endroit chai-as-promised
reste un peu plus propre à utiliser, un catch
est requis si vous voulez tester l'erreur plus en détail.
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
nécessite Node.js 7.6 + ou un compilateur comme Babel
Ce simple lancer fonctionne pour moi
describe('Lead', () => {
it('should create a new lead', async () => {
throw 'not implemented'
})
})