如何存根内部函数并设置变量值

How to stub an inner function and set a variable value

这是我遇到过的较为复杂的场景之一。我有一个需要测试的函数,这个函数嵌套在一个复杂的函数拼图中。我需要存根这个函数,并在variable里面设置一个值。

由于我不允许在这里分享的原因,publishEvent() 方法中的变量在测试期间未定义 运行,我需要一种方法来在测试期间设置该变量的值命令我测试函数中的 if 代码块。

我总结了整个文件,因为由于 NDA,我不能在这里分享代码,如果问题不够详细,抱歉。也许使用 sinon 我可以直接在 publishEvent 函数中设置这个变量的值。

function emitEvent() {
    async function publishEvent() {
        const variable = library.fetchData()

        if (variable) {
            // do something
        }
    }

    return Promise.resolve(publishEvent())
            .then(() => { })
            .catch(() => null);
}

function requestSuscription() {
    return getAllSubscriptions()
        .then((results) => {
            return Promise.map(results, () => emitEvent())
        })
}

function getAllSubscriptions() {
    return new Promise()
}

function requestOtherSubscription() {
    console.log('other thing requested')
}

module.exports = { requestSuscription, requestOtherSubscription }

我知道我可以存入 requestSuscriptionrequestOtherSubscription 函数并且它有效,但我如何存根 publishEvent 并设置变量值?

您需要一种控制 library.fetchData() 输出内容的方法。要么你需要一种 for that library (easiest option) or you need to employ a link seam 的方式(依赖于环境,需要额外的库)——在模块加载级别用一个假的库替换库。

您可以查看这个 SO answer 到一个几乎相同的问题以了解详细信息。