Der Cypress-Anmeldebefehl mit cy.request führt dazu, dass die nachfolgende cy.visit fehlschlägt

8

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.setItemohne cy.requestes einzubeziehen, funktioniert es einwandfrei . Ich möchte jedoch meinen Authentifizierungsserver ( http://localhost:3004/loginunten) 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:

http: // localhost: 8080 /

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)

Johan
quelle
Haben Sie das richtige baseUrl in cypress.json eingestellt?
Josef Biehler
@JosefBiehler Ja, http://localhost:8080es funktioniert gut ohne den cy.requestim Login-Befehl
Johan
1
Das Gleiche scheitert
Tree Nguyen
1
Wenn ich eine generische Version des Codes zu verwenden, Anmeldung vuexData innerhalb .its('body').then((body), it('works', () => {und die Vue App mounted()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, sich bodynach dem POST anzumelden und zu prüfen, ob es die richtige Form hat. Wie verwendet die Vue-App das Token?
Richard Matsen
2
Ich habe eine Beispiel-App so eingerichtet, wie Sie es beschrieben haben, und Cypress funktioniert einwandfrei. Das Token wird vor jedem Serviceaufruf auf 8080 in den lokalen Speicher geschrieben. Sind Sie sicher, dass Ihre App unter 8080 kein Problem aufweist? Ersetzen Sie Ihre App durch eine einfache index.html-Datei mit dem vorhandenen h1-Header (oder nicht) und versuchen Sie es erneut -Laufen Sie den Test.
Jeeves

Antworten:

-1

Einige Sachen. Ich habe noch nie verwendet, cypressaber alle Netzwerkanrufe werden asynchron sein. Keine Ihrer oben genannten Funktionen gibt die aus Ihren Funktionen generierten Versprechen zurück. Also, wo Sie Ihren loginBefehl erstellen . Sie müssen das Versprechen dieser Funktion zurückgeben und es in Ihrer beforeEachFunktion 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 Sie visit(Ihren Test) aufrufen, bevor Ihr Code beforeEachabgeschlossen 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ürde cypressversucht, herauszufinden, wo sich Ihr Dienst befindet. Die andere Sache, wie es aussieht, ist, dass es die in definierte URL requestan die konfigurierte baseUrl anfügt. Sehen Sie tatsächlich, dass die Authentifizierungsanforderung bei Ihrem Authentifizierungsdienst eingeht?

jeeves
quelle
2
In Bezug auf Async haben Sie normalerweise Recht, aber AFAIK, Zypressenanforderungen werden nacheinander ohne ausgeführt 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
Johan
Siehe meinen Kommentar oben, ersetzen Sie Ihre App durch eine einfache HTML-Seite und führen Sie diesen Test erneut aus. Wenn er erfolgreich ist, liegt ein Problem mit Ihrer App vor, nicht mit Zypressen.
Jeeves