开玩笑未解决的承诺不会失败

时间:2018-09-26 08:10:34

标签: testing promise jestjs

笑话说:

  

未解决的承诺

     

如果一个诺言根本无法解决,则可能会抛出此错误:

(依此类推)

就我而言,这不会发生。 我有这个测试:

from pyrfc import Connection

def login():
    conn = Connection(user='xxxx', passwd='xxxxx', ashost='xxxx', sysnr='00', client='100')
    f = conn.call('BAPI_XMI_LOGON', EXTCOMPANY= 'Test',EXTPRODUCT= 'Test Agent',INTERFACE='XAL',VERSION='1.0')

    gettree=conn.call("BAPI_SYSTEM_MON_GETTREE", MONITOR_NAME={'MONI_NAME':'Filesystems','MS_NAME':'SAP CCMS Monitor Templates'},EXTERNAL_USER_NAME='anupk')

    print gettree
    conn.close()

login()

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并进行解析,如果该xml指向另一个xml,则infiniteLoopUrl跟随链接,解析新的xml,合并并重复过程。 现在,VastUtils指向一个引用自身的XML,因此它是一个无限循环。 “正确”,代码将无限地跟随xml链接,并且永远不会解决或拒绝承诺。

我希望上述测试在一定的超时后会失败,但是没有。

有人可以帮助我吗? 谢谢


编辑: 我正在尝试用一个较小的示例重现一个无限的Promise循环,这是我注意到的:

此测试在5s后正确失败:

infiniteLoopUrl

此测试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);
});

显然,这些是相似的,但我不明白造成玩笑无限循环的区别...

1 个答案:

答案 0 :(得分:1)

好的,我已经了解了问题。

原因是js的单线程性质。 在编辑部分的两个示例中,第一个示例有一个超时,因此有一段时间您可以控制并检查超时。 第二个不,所以开玩笑永远不要检查超时。

在我的真实情况下,问题出在假服务器上:它创建为:

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

响应立即使sinon同步响应,所以开玩笑永远无法控制。 创建为:

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

sinon在10毫秒后做出响应,开玩笑可以检查经过的时间