Nodejs Test не выдает ошибки внутри Promise

Итак, я немного новичок в nodejs и обработке обещаний, и я пытаюсь понять, что я здесь делаю неправильно.

Прямо сейчас, когда я запускаю этот тест, я ожидаю, что он потерпит неудачу с сообщением об ошибке в throw new Error, но вместо этого тест проходит, а затем просто печатает сообщение об ошибке Invalid: XXXXXXX как часть UnhandledPromiseRejectionWarning.

Вот как выглядит мой тест. Как я могу сделать этот тест непройденным, если valid не true? Этот тест проводится с шуткой. Я приложил скриншот прохождения теста (когда он должен завершиться неудачно).введите здесь описание изображения

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

person dredbound    schedule 16.06.2018    source источник
comment
Как ваша тестовая среда поддерживает асинхронные тесты?   -  person Bergi    schedule 17.06.2018
comment
как Берги упомянул, что основной причиной является асинхронный поток: сначала ваш тест пройден, и только затем обещание выполнено (не имеет значения, разрешено оно или отклонено на это время)   -  person skyboyer    schedule 17.06.2018
comment
код выглядит как на основе Jasmine. для Jasmine см. jasmine.github.io/2.0/   -  person skyboyer    schedule 17.06.2018
comment
Это новая структура, которую мы только что создали, поэтому в настоящее время она не поддерживает асинхронное тестирование. Будет ли простой способ реализовать это для этого кода или обходной путь, который я могу использовать?   -  person dredbound    schedule 17.06.2018


Ответы (1)


UnhandledPromiseRejectionWarning появляется, потому что отказ от обещания не обрабатывается.

Jest по своей сути поддерживает обещания в спецификациях. Чтобы асинхронная спецификация могла использовать существующее обещание, оно должно быть возвращено из спецификации:

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));
});
person Estus Flask    schedule 16.06.2018
comment
Рад, что это помогло. - person Estus Flask; 17.06.2018