Estoy tratando de hacer un inicio de sesión programático con Cypress antes de cada prueba. Mis tokens persisten en localStorage. Si lo modifico sincrónicamente, es decir, hacer simplemente localStorage.setItem
sin involucrarlo cy.request
funciona bien. Sin embargo, me gustaría usar mi servidor de autenticación (a http://localhost:3004/login
continuación) para generar tokens.
El token se obtiene correctamente del servidor, pero tan pronto como uso el siguiente comando junto con cy.visit('/')
"No se pudo visitar localhost: 8080 - Intentamos hacer una solicitud http a esta URL pero la solicitud falló sin una respuesta" (ver registro completo a continuación).
Por lo que puedo decir, este es el enfoque correcto cuando se utiliza un servidor de autenticación para la autenticación sin cabeza. ¿Qué me perdí?
command.js
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: `http://localhost:3004/login`,
body: {
username: '[email protected]',
password: '123'
}
}).its('body').then((body) => {
const vuexData = { user: { authenticationData: { token: body.token } } }
window.localStorage.setItem('vuex', JSON.stringify(vuexData))
})
})
test.js
describe('A test', () => {
beforeEach(() => {
cy.login()
})
it('works', () => {
cy.visit('/')
cy.get('h1').contains('All Books')
})
})
CypressError: cy.visit () falló al intentar cargar:
Intentamos hacer una solicitud http a esta URL pero la solicitud falló sin una respuesta.
Recibimos este error a nivel de red:
Error: conectar ECONNREFUSED :: 1: 8080
Situaciones comunes por las que esto podría fallar: - no tiene acceso a Internet - olvidó ejecutar / iniciar su servidor web - su servidor web no es accesible - tiene configuraciones de red extrañas en su computadora
El seguimiento de la pila para este error es:
Error: conecte ECONNREFUSED :: 1: 8080 en TCPConnectWrap.afterConnect [como oncomplete] (net.js: 1056: 14)
fuente
baseUrl
en cypress.json?http://localhost:8080
funciona bien sin elcy.request
comando de inicio de sesión.its('body').then((body)
,it('works', () => {
y la aplicación Vuemounted()
, todos tienen valores correctos y los registros se producen en el orden correcto (presionando Typicode con POST). Lo único que puedo sugerir es iniciar sesiónbody
después de la POST y ver si tiene la forma correcta. De lo contrario, ¿cómo usa la aplicación Vue el token?Respuestas:
Un par de cosas. Nunca he usado,
cypress
pero cualquier llamada de red será asíncrona. Ninguna de sus funciones anteriores está devolviendo las promesas generadas por sus funciones. Entonces, ¿dónde creas tulogin
comando? Debe devolver la promesa de esa función y debe esperarla en subeforeEach
función. Puede ser la causa de su problema, tal vez no.¿Es posible que tenga un error en su aplicación donde está agotando el tiempo de espera porque tiene una solicitud no autenticada para el servicio que se ejecuta en el puerto
8080
? Si observa el código tal como está, llamarávisit
(a su prueba) antes de quebeforeEach
se complete. Es muy probable que los datos no se encuentren en el almacenamiento local para cuando realice la prueba.Después de leer rápidamente la documentación
cypress
, parece quecypress
trata de averiguar dónde se encuentra su servicio. La otra cosa que parece es que agrega la url definida enrequest
la baseUrl configurada. ¿Realmente ve la solicitud de autenticación en su servicio de autenticación?fuente
await
, vea el ejemplo aquí que es similar a mi caso: docs.cypress.io/api/cypress-api/… . Un buen punto sobre la URL, sin embargo, lo voy a comprobar