【问题标题】:Sinon stub - Cannot destructure property 'x' of 'undefined' or 'null'Sinon 存根 - 无法解构“未定义”或“空”的属性“x”
【发布时间】:2018-03-28 18:33:05
【问题描述】:

我需要 stubSinon

const { clientId, dateString } = await parameterParser.prepareInputParameters(con, req);

我尝试过使用以下方法:

const retData = {
        clientId: 872,
        dateString: '1970-01-01',
    };

sandbox.stub(parameterParser, 'prepareInputParameters').withArgs(con, req).returns(retData);

但我得到了错误: TypeError: Cannot destructure property 'clientId' of 'undefined' or 'null'.

我在测试的其他地方成功地存根了以下内容:

const { retData } = await sqlFileReader.read('./src/database/sql/getClientIdFromLoanId.sql', [`${req.query.loan_id}`], con, req.logger);

通过使用:

const retData = {
        rowsCount: 1,
        rows: [{ client_id: 872 }],
    };
sandbox.stub(sqlFileReader, 'read').returns({ retData });

但我不知道如何存根const { clientId, dateString }

【问题讨论】:

    标签: sinon destructuring


    【解决方案1】:

    对于这些存根,您需要使用resolves 而不是returns,因为您是awaiting 它们的返回值,实际上应该是Promises 与您的retData 解析,而不是@987654326 @ 自己。

    在 sinon 中,resolves 是异步方法的一种便利。以下两行类似:

    sinon.stub(foo, 'bar').returns(Promise.resolve('baz'));
    sinon.stub(foo, 'bar').resolves('baz');
    

    您的第二个示例可能不会引发错误,但如果您在此行之后记录 retData 的值:

    const { retData } = await sqlFileReader.read('./src/database/sql/getClientIdFromLoanId.sql', [`${req.query.loan_id}`], con, req.logger);
    

    您会注意到它是undefined。这是因为await 导致方法调用的结果是Promise,它没有名为retData 的属性。

    至于为什么您的第一个样本表现不同,我不确定。我怀疑还有其他事情在您的样本中不明显。您介意分享更多代码吗?

    【讨论】:

    • 感谢您的回答。我不介意分享更多代码,但可能要到周日才能这样做。如果我有机会,我会在这里提醒你。
    猜你喜欢
    • 2019-07-15
    • 2020-01-24
    • 2018-09-30
    • 2021-03-21
    • 1970-01-01
    • 2020-01-21
    • 2020-05-28
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多