O comando Cypress login com cy.request faz com que cy.visit subsequente falhe


8

Estou tentando fazer um login programático com o Cypress antes de cada teste. Meus tokens são mantidos no localStorage. Se eu alterá-lo de forma síncrona, ou seja, fazer simpy localStorage.setItemsem envolvê- cy.requestlo funciona bem. No entanto, eu gostaria de usar meu servidor de autenticação ( http://localhost:3004/loginabaixo) para gerar tokens.

O token é buscado corretamente no servidor, mas assim que eu uso o comando abaixo, junto com a cy.visit('/')mensagem "Falha ao visitar o host local: 8080 - tentamos fazer uma solicitação http para este URL, mas a solicitação falhou sem resposta" (consulte log completo abaixo).

Tanto quanto posso dizer, esta é a abordagem correta ao usar um servidor de autenticação para autenticação sem cabeçalho. Do que eu senti falta?

commands.js

Cypress.Commands.add('login', () => {
  cy.request({
    method: 'POST',
    url: `http://localhost:3004/login`,
    body: {
      username: 'foo@bar.com',
      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 () falhou ao tentar carregar:

http: // localhost: 8080 /

Tentamos fazer uma solicitação http para este URL, mas a solicitação falhou sem uma resposta.

Recebemos este erro no nível da rede:

Erro: conectar ECONNREFUSED :: 1: 8080

Situações comuns pelas quais isso falharia: - você não tem acesso à Internet - você esqueceu de executar / inicializar o servidor da Web - o servidor da Web não está acessível - você tem configurações estranhas de configuração de rede no computador

O rastreamento de pilha para este erro é:

Erro: conecte ECONNREFUSED :: 1: 8080 no TCPConnectWrap.afterConnect [conforme a conclusão] (net.js: 1056: 14)


Você definiu o correto baseUrl em cypress.json?
Josef Biehler

@JosefBiehler Sim, http://localhost:8080ele funciona bem sem o cy.requestcomando de login
Johan

1
Na falta da mesma coisa
Tree Nguyen

1
Se eu usar uma versão genérica do seu código, registrando vuexData em .its('body').then((body), it('works', () => {e o aplicativo Vue mounted(), todos eles têm valores corretos e os logs ocorrem na ordem correta (pressionando o tipo de código com o POST). A única coisa que posso sugerir é fazer logon bodyapós o POST e ver se ele possui o formato correto. Caso contrário, como o aplicativo Vue usa o token?
Richard Matsen

2
Configurei um aplicativo de exemplo, como você descreveu e o Cypress funciona perfeitamente. O token é gravado no armazenamento local antes de qualquer chamada para serviço no 8080. Tem certeza de que não há nenhum problema no seu aplicativo em execução no 8080. Substitua seu aplicativo por um arquivo index.html simples com o cabeçalho h1 presente (ou não) e tente re -Executar o teste.
jeeves 29/02

Respostas:


-1

Um par de coisas. Eu nunca usei, cypressmas todas as chamadas de rede serão assíncronas. Nenhuma de suas funções acima está retornando as promessas geradas a partir de suas funções. Então, onde você cria seu logincomando. Você precisa devolver a promessa dessa função e aguardá-la em sua beforeEachfunção. Pode ser a causa do seu problema, talvez não.

É possível que você tenha um erro no aplicativo em que está atingindo o tempo limite porque possui uma solicitação não autenticada para o serviço em execução na porta 8080. Observando o código como está, você telefonará para visit(seu teste) antes de beforeEachconcluir. É muito provável que os dados não estejam no armazenamento local quando você realizar o teste.

Após uma rápida leitura da documentação cypress, parece que cypresstentamos descobrir onde o serviço está localizado. A outra coisa que parece é que ele anexa a URL definida na requestbaseUrl configurada. Você realmente vê a solicitação de autenticação no seu serviço de autenticação?


2
Em relação ao assíncrono, normalmente você está certo, mas AFAIK, solicitações de ciprestes são executadas em sequência sem await, veja o exemplo aqui que é semelhante ao meu caso: docs.cypress.io/api/cypress-api/… . Bom ponto sobre a URL, no entanto, vou dar uma olhada
Johan

Veja meu comentário acima, substitua seu aplicativo por uma página html simples e execute novamente o teste; se for aprovado, é um problema com seu aplicativo, não com cipreste.
jeeves 29/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.