Ich versuche vor jedem Test ein programmgesteuertes Login mit Cypress durchzuführen. Meine Token bleiben in localStorage erhalten. Wenn ich es synchron ändere, dh einfach zu tun, localStorage.setItem
ohne cy.request
es einzubeziehen, funktioniert es einwandfrei . Ich möchte jedoch meinen Authentifizierungsserver ( http://localhost:3004/login
unten) verwenden, um Token zu generieren.
Das Token wird korrekt vom Server abgerufen, aber sobald ich den folgenden Befehl zusammen mit cy.visit('/')
"Fehler beim Besuch von localhost: 8080 - Wir haben versucht, eine http-Anfrage an diese URL zu senden, aber die Anfrage ist ohne Antwort fehlgeschlagen" erhalte (siehe vollständiges Protokoll unten).
Soweit ich das beurteilen kann, ist dies der richtige Ansatz, wenn ein Authentifizierungsserver für die kopflose Authentifizierung verwendet wird. Was habe ich verpasst?
befehle.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 () konnte nicht laden:
Wir haben versucht, eine http-Anfrage an diese URL zu stellen, aber die Anfrage ist ohne Antwort fehlgeschlagen.
Wir haben diesen Fehler auf Netzwerkebene erhalten:
Fehler: ECONNREFUSED :: 1: 8080 verbinden
Häufige Situationen, in denen dies fehlschlagen würde: - Sie haben keinen Internetzugang - Sie haben vergessen, Ihren Webserver auszuführen / zu starten - Ihr Webserver ist nicht zugänglich - Sie haben seltsame Netzwerkkonfigurationseinstellungen auf Ihrem Computer
Die Stapelverfolgung für diesen Fehler lautet:
Fehler: Verbinden Sie ECONNREFUSED :: 1: 8080 unter TCPConnectWrap.afterConnect [als unvollständig] (net.js: 1056: 14)
quelle
baseUrl
in cypress.json eingestellt?http://localhost:8080
es funktioniert gut ohne dency.request
im Login-Befehl.its('body').then((body)
,it('works', () => {
und die Vue Appmounted()
alles , was sie richtige Werte und Protokolle treten in der richtigen Reihenfolge haben (Schlagen typicode mit dem POST). Das einzige, was ich vorschlagen kann, ist, sichbody
nach dem POST anzumelden und zu prüfen, ob es die richtige Form hat. Wie verwendet die Vue-App das Token?Antworten:
Einige Sachen. Ich habe noch nie verwendet,
cypress
aber alle Netzwerkanrufe werden asynchron sein. Keine Ihrer oben genannten Funktionen gibt die aus Ihren Funktionen generierten Versprechen zurück. Also, wo Sie Ihrenlogin
Befehl erstellen . Sie müssen das Versprechen dieser Funktion zurückgeben und es in IhrerbeforeEach
Funktion abwarten . Könnte die Ursache Ihres Problems sein, vielleicht auch nicht.Ist es möglich , dass Sie einen Fehler haben in Ihnen Anwendung , wo Sie ein Timeout, weil Sie eine nicht authentifizierte Anforderung an den Service haben läuft auf Port
8080
. Wenn Sie sich den aktuellen Code ansehen, werden Sievisit
(Ihren Test) aufrufen, bevor Ihr CodebeforeEach
abgeschlossen ist. Es ist sehr wahrscheinlich, dass sich die Daten zum Zeitpunkt Ihres Tests nicht im lokalen Speicher befinden.Wenn Sie die Dokumentation schnell durchlesen
cypress
, scheint es, als würdecypress
versucht, herauszufinden, wo sich Ihr Dienst befindet. Die andere Sache, wie es aussieht, ist, dass es die in definierte URLrequest
an die konfigurierte baseUrl anfügt. Sehen Sie tatsächlich, dass die Authentifizierungsanforderung bei Ihrem Authentifizierungsdienst eingeht?quelle
await
. Siehe das Beispiel hier, das meinem Fall ähnlich ist: docs.cypress.io/api/cypress-api/… . Guter Punkt über die URL, werde es überprüfen