Search code examples
javascriptnode.jspromisejestjssupertest

Nodejs Test not erroring out inside Promise


So I'm a bit new to nodejs and promise handling, and I'm trying to figure out what I'm doing wrong here.

Right now when I run this test I expect it to fail with the error message in throw new Error but instead the test passes and then just prints the error message Invalid: XXXXXXX as part of an UnhandledPromiseRejectionWarning.

Here is what my test looks like. How can I make this test fail when valid is not true? This test is run with jest. I've attached a screenshot of the test passing (when it should fail).enter image description here

const request = require('supertest');
const { verifyJsonResponse } = require('../verifiers/verifiers');

const Ajv = require('ajv');
const ajv = new Ajv({allErrors: true});
const assert = require('assert');

const baseURL = 'myAPIBaseUrl';
const endPointExtensions = ['myAPIExtension'];
const schema = require('./../pathToJsonSchema/schemaFile.json');

describe('runs remotely specified test cases', () => {
    it('should receive expected response for each parameter group', () => {
        request(baseURL).get(endPointExtensions[0]).then((res) => {
            const validate = ajv.compile(schema);
            const valid = validate(res.body);
            if (valid) console.log('Valid!');
            else throw new Error('Invalid: ' + ajv.errorsText(validate.errors));
        });
    });
});

Solution

  • UnhandledPromiseRejectionWarning appears, because promise rejection is not handled.

    Jest inherently supports promises in specs. In order for asynchronous spec to make use of existing promise, it should be returned from the spec:

    it('should receive expected response for each parameter group', () => {
        return request(baseURL).get(endPointExtensions[0]).then((res) => {
            const validate = ajv.compile(schema);
            const valid = validate(res.body);
            if (valid) console.log('Valid!');
            else throw new Error('Invalid: ' + ajv.errorsText(validate.errors));
        });
    });
    

    Or:

    it('should receive expected response for each parameter group', async () => {
        const res = await request(baseURL).get(endPointExtensions[0]);
        const validate = ajv.compile(schema);
        const valid = validate(res.body);
        if (valid) console.log('Valid!');
        else throw new Error('Invalid: ' + ajv.errorsText(validate.errors));
    });