Шут нерешенным обещанием не подведет - PullRequest
0 голосов
/ 26 сентября 2018

В Jest docs написано:

Неразрешенные обещания

Если обещание не разрешается вообще, эта ошибка может быть выдана:

(и так далее)

В моем случае этого не произойдет.У меня есть этот тест:

test('detect infinite loop', () => {
    expect.assertions(1);

    const vastPromise = VastUtils.parseFromUrl(infiniteLoopUrl);
    const expectedError =
        new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
   return expect(vastPromise).rejects.toEqual(expectedError); 
});

VastUtils просто получить XML, расположенный по адресу infiniteLoopUrl, проанализировать его, и если этот xml указывает на другой xml, VastUtils перейти по ссылке, проанализировать новый xml, объедините их и повторите процесс.Теперь infiniteLoopUrl указывает на XML, который ссылается на себя, так что это бесконечный цикл.«правильно», код следует по xml-ссылке бесконечно и никогда не разрешает и не отклоняет обещание.

Я ожидаю, что вышеописанный тест не пройден после определенного времени ожидания, но это не так.

Кто-то может помочьмне?Спасибо


РЕДАКТИРОВАТЬ: я пытаюсь воспроизвести бесконечный цикл Promise с меньшим примером, и это то, что я заметил:

этот тест правильно провалился через 5 с:

test('Promise2', () => {
    const genPromise = (): Promise<void> => {
        return new Promise((res) => {
            setTimeout(() => {
                res();
            }, 200);
        })
        .then(() => {
            return genPromise();
        });
    };

    const vastPromise = genPromise();

    const expectedError =
        new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
    return expect(vastPromise).rejects.toEqual(expectedError);
});

Этот тест НЕ ОТКАЗЫВАЕТСЯ через 5 с (шутка остается в бесконечном цикле)

test('Promise', () => {
    const genPromise = (prom: Promise<void>): Promise<void> => {
        return prom
        .then(() => {
            return genPromise(Promise.resolve());
        });
    };

    const vastPromise = genPromise(Promise.resolve());

    const expectedError =
        new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
    return expect(vastPromise).rejects.toEqual(expectedError);
});

Очевидно, что они похожи, но я не понимаю разницу, которая вызывает шутку бесконечнойпетля ...

1 Ответ

0 голосов
/ 26 сентября 2018

Хорошо, я понимаю проблему.

Причина - однопоточная природа js.В двух примерах раздела редактирования первый имеет тайм-аут, так что есть момент, когда Jest берет управление и может проверить тайм-аут.Во втором нет, поэтому никогда не проверяйте время ожидания.

В моем реальном случае проблема заключалась в поддельном сервере: он был создан как:Так что шутка никогда не будет под контролем.Создайте его как:

server = sinon.fakeServer.create({
    autoRespond: true
});

sinon ответит через 10 мс, и Jest может проверить время, прошедшее

...