Почему ожидание вызова моего обычного обещания зависает? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь проверить функцию в моем бэкэнде Express / Node с помощью Mocha. Я создал заглушку фактического параметра, который изменяется функцией: у него есть метод send, который вызывается в getValue (функция, которую я хочу проверить), и параметр ready, который я инициализирую новым обещанием, когда заглушка создается и разрешается при вызове send заглушки.

Я пытаюсь await выполнить это обещание, но оно просто зависает (а затем Мокко прерывает тест). Приведенное ниже значение setTimeout печатает Promise { 'abc' }, что, я думаю, означает, что обещание выполнено так, как я ожидаю, но ожидание никогда не завершится.

Это соответствующий код в тестовом файле:

function ResStubTemplate() {
        return {
                _json: undefined,
                _message: undefined,
                json: function(x) {
                        this._json = x;
                        return this;
                },
                send: function(message) {
                        this._message = message;
                        this.ready = Promise.resolve("abc");
                        return this;
                },
                ready: new Promise(_ => {})
        }
}

// This is the test
it("should get the value.", async function(done) {
        let req = { query: { groupId: 12345 } };
        res = ResStubTemplate();
        controller.getValue(req, res);
        setTimeout(() => console.log(res.ready), 1000); // prints Promise { 'abc' }
        let x = await res.ready; // hangs??
        console.log(x); // never prints
        done();
}

Это соответствующий код в проверенном файле:

exports.getValue = function(req, res) {
        ValueModel.findOne({groupId: req.query.groupId})
           .then(value => res.json({value: value}).send();                                                                                                         
};                                                                                                    

Я получаю ошибку:

Error: Timeout of 5000ms exceeded. 
For async tests and hooks, ensure "done()" is called; if returning a Promise,
ensure it resolves. (/.../test/api/controller_test.js)

1 Ответ

3 голосов
/ 02 апреля 2019

Когда вычисляется выражение:

let x = await res.ready; // hangs??

…, значением является обещание, созданное этим кодом:

ready: new Promise(_ => {})

Это обещание никогда не разрешается, поэтому оно продолжает его ждать.

Позже вы делаете это:

 this.ready = Promise.resolve("abc");

… который заменяет это обещаниес новым (разрешенным) обещанием, но новое обещание не соответствует ожидаемому вами значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...