Estoy trabajando con solicitudes encadenadas y necesito esperar hasta que se cumpla una condición para poder probar la respuesta. La solicitud anterior siempre devolverá una respuesta, pero necesito que su estado sea "terminado" y, a veces, está "en progreso". No quiero usar una espera estática para este cy.wait() porque eso hace que las pruebas sean inestables o duren para siempre. ¿Como lo puedo hacer? Este es mi código hasta ahora, pero se atasca y nunca termina. Con espera estática (sin bucle) funciona bastante bien.
¿Algunas ideas?
it('name of the test', function() { cy.processFile().then((response) => { let i=0; while (i<5){ cy.wait(1000); cy.getInfo().then((resp) => { if(resp.body.status !== 'finished'){ i++; } else { i = 5; expect(.....); } }) } }) })La declaración while (i<5) { es síncrona y se ejecuta a través de las cinco iteraciones antes de que comience la prueba.
En cambio, esto debería funcionar
function waitForStatus (status, count = 0) { if (count === 5) { throw 'Never finished' } return cy.getInfo().then(resp => { if (resp.body.status !== status) { cy.wait(1000) // may not need to wait waitForStatus(status, ++count) // run again, up to 5 times } else { return resp // in case you want to expect(resp)... } }) } cy.processFile().then((response) => { waitForStatus('finished').then(resp => { expect(resp)... }) })Hay una información más detallada aquí Escribir una función recursiva de Cypress
tu escenario
npm i -D cypress-recurse # or use Yarn yarn add -D cypress-recurse import { recurse } from 'cypress-recurse' it('waits for status', () => { cy.processFile().then((response) => { recurse( () => cy.getInfo(), (resp) => resp.body.status === 'finished', { log: true, limit: 5, // max number of iterations timeout: 30000, // time limit in ms delay: 1000 // delay before next iteration, ms }, ) .then(resp => { expect(resp)... }) })