Solución:
¡Gracias por la descripción detallada! Te proporciono una solución para tu primera pregunta.
Estoy tratando de averiguar si puedo omitir condicionalmente una prueba () en mi conjunto de pruebas y lidiar con su naturaleza asíncrona también.
Use una variable de entorno, le informo una solución mía (en realidad la estoy usando en mi canalización).
if (!Cypress.env("SKIP_E2E_TESTS")) {
it(...);
}
y en mi package.json
archivo tengo un script que se parece a esto
"test": "CYPRESS_SKIP_E2E_TESTS=true npm-run-all --parallel --silent test:unit test:cypress",
Mi objetivo era el mismo que el tuyo, me gustaría deshabilitar algunas pruebas en algunas circunstancias (la canalización de CI en mi caso).
Así que ponga toda la prueba en una condición en lugar de tener una prueba condicional.
Avísame si necesitas más ayuda
Creo que casi estás ahí, pero en lugar del sincronizado if () {...} else {...}
patrón, necesita el patrón de devolución de llamada asincrónica.
it('shows the list', function() {
const whenFailed = function() {
this.skip()
}
const whenSucceeded = function() {
cy.get('.list').should('be.visible')
}
queryFailed(whenFailed, whenSucceeded);
}
function queryFailed(whenFailed, whenSucceeded) {
cy.get('.spin')
.then($container => {
const htmlLoaded = $container[0].innerHTML;
if (htmlLoaded.indexOf('List') !== -1) {
whenSucceeded();
return;
}
if (htmlLoaded.indexOf('error') !== -1) {
whenFailed();
return;
}
cy.wait(1000);
queryFailed(whenFailed, whenSucceeded);
});
}
Sin embargo, noto la llamada recursiva a queryFailed()
, que parece que está volviendo a intentar manualmente el contenido del contenedor de giro.
Cypress ha incorporado reintentos, por lo que todo lo que tiene que hacer es decidir el tiempo máximo que posiblemente tomará su resultado (digamos 20 segundos), y concluirá el comando tan pronto como llegue el contenido deseado, o fallará la prueba por completo si no sucede en 20 segundos.
Además, debe tener el control del éxito / fracaso de lo que esté esperando el spinner (por ejemplo, obtener la lista a través de XHR). Por lo tanto, debe dividir la prueba en dos: una para el éxito y otra para el fracaso.
context('when the list loading succeeds' function() {
it('shows the list', function() {
// Mock XHR success here
cy.contains('.spin', 'List', { timeout: 20000 });
cy.get('.list').should('be.visible');
})
it('does not show an error message', function() {
...
})
})
context('when the list loading fails' function() {
it('does not show the list', function() {
// Mock XHR failure here
cy.contains('.spin', 'error', { timeout: 20000 });
cy.get('.list').should('not.be.visible');
})
it('shows an error message', function() {
...
})
})
Esto es un poco tosco ya que no sé el HTML exacto que se espera, o lo que está esperando la ruleta, pero puede ver que este patrón es mucho más ordenado y prueba todas las rutas de manera controlada.
Cypress ahora también proporciona una biblioteca @ cypress / skip-test que puede brindar más controles al
cy.skipOn
cy.onlyOn
isOn
- bandera booleana
- entornos con cabeza / sin cabeza
- MEDIO AMBIENTE
DIVULGAR: No estoy asociado con Cypress.