El comando de inicio de sesión de Cypress con cy.request hace que falle cy.visit posterior

8

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.setItemsin involucrarlo cy.requestfunciona bien. Sin embargo, me gustaría usar mi servidor de autenticación (a http://localhost:3004/logincontinuació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:

http: // localhost: 8080 /

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)

Johan
fuente
¿Has configurado lo correcto baseUrl en cypress.json?
Josef Biehler
@JosefBiehler Sí, http://localhost:8080funciona bien sin el cy.requestcomando de inicio de sesión
Johan
1
Fallando lo mismo
Tree Nguyen
1
Si utilizo una versión genérica de su código, registrando vuexData dentro .its('body').then((body), it('works', () => {y la aplicación Vue mounted(), 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ón bodydespués de la POST y ver si tiene la forma correcta. De lo contrario, ¿cómo usa la aplicación Vue el token?
Richard Matsen
2
He configurado una aplicación de ejemplo tal como la describiste y Cypress funciona perfectamente. El token se escribe en el almacenamiento local antes de cualquier llamada de servicio en 8080. ¿Está seguro de que no hay ningún problema en su aplicación que se ejecuta en 8080? Reemplace su aplicación con un simple archivo index.html con el encabezado h1 presente (o no) e intente volver -Ejecute la prueba.
jeeves

Respuestas:

-1

Un par de cosas. Nunca he usado, cypresspero cualquier llamada de red será asíncrona. Ninguna de sus funciones anteriores está devolviendo las promesas generadas por sus funciones. Entonces, ¿dónde creas tu logincomando? Debe devolver la promesa de esa función y debe esperarla en su beforeEachfunció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 que beforeEachse 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 que cypresstrata de averiguar dónde se encuentra su servicio. La otra cosa que parece es que agrega la url definida en requestla baseUrl configurada. ¿Realmente ve la solicitud de autenticación en su servicio de autenticación?

jeeves
fuente
2
Con respecto a async, normalmente tiene razón, pero AFAIK, las solicitudes de cipreses se ejecutan en secuencia sin 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
Johan
Vea mi comentario anterior, reemplace su aplicación con una página html simple y vuelva a ejecutar esa prueba, si pasa, es un problema con su aplicación no ciprés.
jeeves