Robin Masters Robin Masters - 29 days ago 16
Javascript Question

How to get Mocha to fail a test

I have the following test:

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();


});


The test execution path is correct. When i have validating data, it goes to "SHOULD NOT GET HERE". The test is really to make sure it doesn't. And when I put in non validating data the code does go to "SHOULD GET HERE". So the validation rules work.

What I'm trying to do is make sure the test fails when when i have bad validation data and it validates. However when I run it as it is with good data it validates, runs the fail, but mocha still marks it as the passing. I want it to fail if the execution gets to "SHOULD NOT GET HERE".

i've tried throw new Error("fail"); as well with no luck. In both cases it actually seems to run the code in the .catch block as well.

Any suggestions?
I found solutions for this in a similar question. This question is written because those solutions don't seem to be working for me.

Thanks,

Answer

Use chai as promised, with native Mocha promise handlers.

var chai = require('chai').use(require('chai-as-promised'));
var should = chai.should(); // This will enable .should for promise assertions

You no longer need done, simply return the promise.

// 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();


        });