【JavaScript UT测试--02】--js单元测试(UT) 测试异步函数

本文探讨了如何针对JavaScript中包含异步操作的函数编写有效的单元测试,特别是针对使用.then, .tap 和 .catch 的路径进行测试。文章通过具体案例说明了如何正确地模拟异步行为并验证其执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS里面异步非常普遍,后端开发就免不了对异步函数进行单元测试(UT)了。

那么怎么测试then, tap,catch后面的路径呢? 看例子

案例分析

代码

有如下方法updateStateExceptAxc需要写单元测试, 存放在文件名为radioStateHelper.js里。

// radioStateHelper.js
function updateStateExceptAxc(antennaLineUri) {
    // 代码...
    return module.exports.updateState(affectedUrisExceptAxc)
        .tap(function() {
            logger.debug("change state of resource %s successful", JSON.stringify(affectedUrisExceptAxc));
        }).catch(function(err) {
            logger.error("change state of resource %s failed, fail reason %s", JSON.stringify(affectedUrisExceptAxc), err.message);
        });
}

function updateState(resourceUris) {
    return Promise.try(function() {
        resourceUris.forEach(function(resourceUri) {
            var availabilityStatus = module.exports.getWorstStatus(resourceUri);
            var status = {
                availabilityStatus: availabilityStatus,
                operationalState: (availabilityStatus === availabilityStatus.FAILED ||
                    availabilityStatus === availabilityStatus.OFFLINE) ? operationalState.DISABLED : operationalState.ENABLED
            };
            mzframe.updateResourceByUri(resourceUri, status);
        });
    });
}

// only for UT testing
module.exports.updateStateExceptAxc = updateStateExceptAxc;
module.exports.updateState = updateState;

单元测试文件,对updateStateExceptAxc()方法进行测试。

it.only("updateStateExceptAxc(): should call updateState method once", function(done) {
    inq.mock(radioStateHelper, "updateState"); // 注意这里,有问题需要改进
    inq.expect(radioStateHelper.updateState).once; 
    radioStateHelper.updateStateExceptAxc(antennaLineUri).then(done);
});

测试结果

不能够找到undefined的tap
tap_ERROR

分析

期望结果
首先测试里,我们mock了一个updateState方法,并且期望当调用radioStateHelper.updateStateExceptAxc(antennaLineUri)时候,这个mock的方法被执行一次【().once】。

实际情况
抛出了异常(TypeError: Cannot read property ‘tap’ of undefined)。

原因分析
其实,mock的updateState方法是被执行了一次,只是这里的错误是由于module.exports.updateState(affectedUrisExceptAxc).tap(function()tap引起的,这里期望module.exports.updateState(affectedUrisExceptAxc)返回的是一个异步内容,能够thenable的。 所以需要在mock的时候,返回一个thenable内容。

改进措施

// 代码更改
inq.mock(radioStateHelper, "updateState"); // 注意这里,有问题需要改进

// ==> 更改 ==>
// 如果测试tap路径
inq.mock(radioStateHelper, "updateState").returns(Promise.resolve());

// 如果测试catch路径
inq.mock(radioStateHelper, "updateState").returns(Promise.reject(new Error(“failedNow”));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木瓜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值