使用Mocha+Axios TrobuleShooting进行异步Await



我们使用的是mocha+nodejs+axios

下面是我的一段代码,它们都在不同的文件中。

文件1:IT块

it('Perform Post Payment Actions', function () {
postPaymentController.triggerPostPaymentActions(params);
});

文件2:控制器

module.exports.triggerPostPaymentActions = function (params) {
const actions = params.postAuthActionId.split('-');  // // 'PARTIALREFUND, 50, SUCCESS - PARTIALREFUND, 50, FAIL
Object.entries(actions).forEach(([, action]) => {
const actionAsArray = action.split(','); // 'PARTIALREFUND, 50, SUCCESS 
switch (actionAsArray[0]) {. // PARTIALREFUND
case 'PARTIALREFUND':
paymentsPartialRefundApi.submitPaymentsPartialRefundApi(actionAsArray, params);
break;
default:
break;
}
});
};

文件3:使用axios 的Acutal API调用


module.exports.submitPaymentsPartialRefundApi = async function (actionDetails, params) {
const postOptions = {
url: partialRefundApiUri,
method: 'POST',
headers: restHeaders,
data: params.partialRefundRequest,
};
try {
const response = await axios(postOptions);
params.partialRefundResponse = response.data;
process.env.PARTIALREFUNDRESPONSE = JSON.stringify(params.partialRefundResponse);
} catch (err) {
process.env.ERRORCODE = err;
process.env.SCRIPT_STATUS = 'failure';
process.env.PARTIALREFUNDRESPONSE = 'Partial Refund request Failed';
throw err;
}

};

问题:

当控制权被传递给submitPaymentsPartialRefundApi时,它会构建对axios的请求,但不是等待axios调用,而是将控制权带回交换机情况。我的预期是,由于我使用async wait,它将执行并等待axios调用完成,但它没有完成调用,而是将控制返回到switch语句,并从switch返回到it块。所以我有两个问题。1它不是在等待axios调用结束2它没有在循环中运行交换机两次,它返回到IT块,然后返回。

尝试的解决方案:

我已经尝试过使用promise,无论有没有超时,但仍然没有效果。如有任何帮助,我们将不胜感激。

submitPaymentsPartialRefundApi是一个异步函数,但您不会在控制器中等待它的完成。

你的代码非常奇怪,我不明白它应该做什么,因为你没有从控制器函数返回任何东西,你的测试脚本实际上也没有测试任何东西。话虽如此,您的控制器需要执行以下操作:

module.exports.triggerPostPaymentActions = function (params) {
const actions = params.postAuthActionId.split('-');  // // 'PARTIALREFUND, 50, SUCCESS - PARTIALREFUND, 50, FAIL

return Promise.all(Object.entries(actions).map(([, action]) => {
const actionAsArray = action.split(',');
switch (actionAsArray[0]) {
case 'PARTIALREFUND':
return paymentsPartialRefundApi.submitPaymentsPartialRefundApi(actionAsArray, params);
break;
default:
// return something here or use Array.filter before Array.map
break;
}
}));
}

然后,您的it块应该测试返回的promise是否得到了解决。。。

it('Perform Post Payment Actions', function () {
return expectAsync(postPaymentController.triggerPostPaymentActions(params)).toBeResolved();
});

最新更新