Как использовать Обещания в тестах Почтальона? - PullRequest
0 голосов
/ 26 декабря 2018

Мне нужно использовать некоторый асинхронный код в моем тесте Почтальона.

Поскольку это сложный сценарий, я воспроизвел сценарий в очень простом тесте со следующим кодом:

let promiseNumber = 0;

function resolvedPromise() {
    return new Promise((resolve, reject) => {
        pm.sendRequest('https://postman-echo.com/get', (err, res) => {
            if (err) {
                console.log(err);
                reject();
            } else {
                console.log(`Resolved promise ${++promiseNumber}`);
                resolve();
            }
        });
    });
}

resolvedPromise()
    .then(resolvedPromise)
    .then(resolvedPromise)
    .catch(err => console.log(err));

Ожидаемый результат на консоли будет:

Resolved promise 1
Resolved promise 2
Resolved promise 3

Но вместо этого я получаю:

Resolved promise 1

Есть ли способ сделать Обещания или асинхронный код доступными в Почтальоне?

1 Ответ

0 голосов
/ 26 декабря 2018

ОБНОВЛЕНИЕ : Исходное решение использовало 2147483647 в качестве значения тайм-аута, теперь оно было реорганизовано для использования Number.MAX_SAFE_INTEGER, как предложено в комментариях.

Я провел еще несколько тестов и понял, что оновсегда прекращайте работать после того, как я использую pm.sendRequest.Если я попытаюсь выполнить Обещание, оно будет работать.

Кажется известной ошибкой, глядя на эту тему .

Обходной путь для этого - оставить открытым тайм-аут при обработке кода.Просто убедитесь, что все возможные пути очищают тайм-аут, или вызов будет зависать на 300000 лет ?

// This timeout ensure that postman will not close the connection before completing async tasks.
//  - it must be cleared once all tasks are completed or it will hang
const interval = setTimeout(() => {}, Number.MAX_SAFE_INTEGER);

let promiseNumber = 0;

function resolvedPromise() {
    return new Promise((resolve, reject) => {
        pm.sendRequest('https://postman-echo.com/get', (err, res) => {
            if (err) {
                console.log(err);
                reject();
            } else {
                console.log(`Resolved promise ${++promiseNumber}`);
                resolve();
            }
        });
    });
}

resolvedPromise()
    .then(resolvedPromise)
    .then(resolvedPromise)
    .then(() => clearTimeout(interval))
    .catch(err => {
        console.log(err);
        clearTimeout(interval);
    });

Теперь он печатает ожидаемый результат:

Resolved promise 1
Resolved promise 2
Resolved promise 3
...