我们使用的是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();
});