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.setItem
sem envolvê- cy.request
lo funciona bem. No entanto, eu gostaria de usar meu servidor de autenticação ( http://localhost:3004/login
abaixo) 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: '[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 () falhou ao tentar carregar:
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)
fonte
baseUrl
em cypress.json?http://localhost:8080
ele funciona bem sem ocy.request
comando de login.its('body').then((body)
,it('works', () => {
e o aplicativo Vuemounted()
, 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 logonbody
após o POST e ver se ele possui o formato correto. Caso contrário, como o aplicativo Vue usa o token?Respostas:
Um par de coisas. Eu nunca usei,
cypress
mas 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 seulogin
comando. Você precisa devolver a promessa dessa função e aguardá-la em suabeforeEach
funçã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á paravisit
(seu teste) antes debeforeEach
concluir. É 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 quecypress
tentamos descobrir onde o serviço está localizado. A outra coisa que parece é que ele anexa a URL definida narequest
baseUrl configurada. Você realmente vê a solicitação de autenticação no seu serviço de autenticação?fonte
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