Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to provide chai expect with custom error message for mocha unit test?

I have a mocha test using chai's expect:

it("should parse sails out of cache file", async () => {
    const sailExtractor = new Extractor();
    const result = await sailExtractor.extract("test.xml");

    try {
        expect(result.length).to.be.greaterThan(0);
        const withMandatoryFlight = result.filter((cruises) => {
            return cruises.hasMandatoryFlight === true;
        });
        expect(withMandatoryFlight.length).to.be.greaterThan(0);
        const cruiseOnly = result.filter((cruises) => {
            return cruises.hasMandatoryFlight === false;
        });

        expect(cruiseOnly.length).to.be.greaterThan(0);

        return Promise.resolve();
    } catch (e) {
        return Promise.reject(e);
    }
}

Now if one to.be.greaterThan(0) expectation fails, the error output on mocha is not dev-friendly:

 AssertionError: expected 0 to be above 0
      at Assertion.assertAbove (node_modules/chai/lib/chai/core/assertions.js:571:12)
      at Assertion.ctx.(anonymous function) [as greaterThan] (node_modules/chai/lib/chai/utils/addMethod.js:41:25)
      at _callee2$ (tests/unit/operator/croisiEurope/CroisXmlExtractorTest.js:409:61)
      at tryCatch (node_modules/regenerator-runtime/runtime.js:65:40)
      at Generator.invoke [as _invoke] (node_modules/regenerator-runtime/runtime.js:303:22)
      at Generator.prototype.(anonymous function) [as next] (node_modules/regenerator-runtime/runtime.js:117:21)
      at fulfilled (node_modules/tslib/tslib.js:93:62)
      at <anonymous>
      at process._tickDomainCallback (internal/process/next_tick.js:228:7)

I would like to replace it with something more human-friendly. Is there a way to tell chai to use a customize error message?

I want to be able to use it like this pseudo-code:

 expect(result.length)
      .to.be.greaterThan(0)
      .withErrorMessage("It should parse at least one sail out of the flatfile, but result is empty");

And then the failing mocha error should print:

 AssertionError: It should parse at least one sail out of the flatfile, but result is empty
like image 877
k0pernikus Avatar asked Aug 14 '17 16:08

k0pernikus


People also ask

How do you write unit test cases with Mocha?

To write the first unit test using Mocha and Chai, first let's create a simple function named isNumValid which returns true for values in between 10 and 70, and returns false for values greater than or equal to 70 and less than or equal to 10. Now we can write the tests to verify this functions behavior.

What assertion styles are present in Chai testing assertion library?

Chai is such an assertion library, which provides certain interfaces to implement assertions for any JavaScript-based framework. Chai's interfaces are broadly classified into two: TDD styles and BDD styles.


2 Answers

Every expect method accepts an optional parameter message:

expect(1).to.be.above(2, 'nooo why fail??');
expect(1, 'nooo why fail??').to.be.above(2);

So, in your case it should be:

expect(result.length)
  .to.be.greaterThan(0, "It should parse at least one sail out of the flatfile, but result is empty");
like image 175
alexmac Avatar answered Oct 18 '22 03:10

alexmac


If you use should for your assertions you can pass a string to the test function which will be written out if the condition fails. For example:

result.length.should.be.above(0, "It should parse at least one sail out of the flatfile, but result is empty");

I'm not sure if this is possible with expect. The API doesn't seem to mention it.

like image 22
robjwilkins Avatar answered Oct 18 '22 04:10

robjwilkins