estamos usando mocha + nodejs + axios
A continuación se muestra el fragmento de código que tengo, todos están en un archivo diferente.
Archivo 1: bloque de TI
it('Perform Post Payment Actions', function () { postPaymentController.triggerPostPaymentActions(params); });Archivo 2: Controlador
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; } }); };Archivo 3: Llamada API Acutal usando axios
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; } };PROBLEMA :
Cuando se pasa el control a submitPaymentsPartialRefundApi , crea la solicitud de axios pero, en lugar de esperar la llamada de axios, lleva el control de vuelta al caso del interruptor. mi expectativa era que, dado que estoy usando async await, se ejecutará y esperará hasta que se complete la llamada axios, pero en lugar de completar la llamada, devuelve el control a la declaración del interruptor y desde el interruptor vuelve al bloque de TI. entonces tengo 2 problemas. 1 No está esperando a que finalice la llamada axios 2 No está ejecutando el interruptor dos veces en bucle, vuelve al bloque de TI y luego regresa.
Soluciones probadas:
Ya intenté usar promesas para esto, con y sin tiempo de espera, pero aún así no funcionó. Cualquier ayuda en esto es apreciada.
submitPaymentsPartialRefundApi es una función asíncrona, pero no está esperando que se complete en su controlador.
Su código es muy extraño y no entiendo qué se supone que debe hacer, ya que no devuelve nada de la función de su controlador y su script de prueba en realidad no prueba nada. Dicho esto, su controlador debe hacer algo como lo siguiente:
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; } })); } Entonces it bloque debería probar que la promesa devuelta se resuelve o algo así...
it('Perform Post Payment Actions', function () { return expectAsync(postPaymentController.triggerPostPaymentActions(params)).toBeResolved(); });