Cucumber-js: Fehler: Funktion verwendet mehrere asynchrone Schnittstellen: Rückruf und Versprechen

Erstellt am 3. Juli 2017  ·  7Kommentare  ·  Quelle: cucumber/cucumber-js

Hallo alle zusammen,
Ich habe einen Fall, in dem ich Async in den Schrittdefinitionen nicht verwenden kann.
Ich habe ein einfaches Szenario, in dem ich mich über die API-Schnittstelle meiner Anwendung anmelde, um das Authentifizierungstoken abzurufen
Meine Feature-Datei ist:

Feature: Login
  Scenario: Login using api
    Given I login to my account with my username and password
    Then I should get an authorization token
      |username|password|
      |[email protected]|dev|

meine schritte sind:

defineSupportCode(({ Given, Then, setDefaultTimeout }) => {
  const timeOut = 30000;
  const baseSteps: BaseSteps = new BaseSteps();
  setDefaultTimeout(timeOut);

  // tslint:disable-next-line:only-arrow-functions
  Given(/^I login to my account with my username and password$/, async (table: TableDefinition) => {
   const userData = table.hashes();

    const loginResponse =  await baseSteps.loginUser(userData[0].username, userData[0].password);


    console.log('Login response is ', loginResponse);
    const statusCode = 302;

    expect(await loginResponse.status).to.equal(statusCode);
  });

   Then(/^I should get an authorization token$/, async () => {
    const authorizationHeader = await baseSteps.getAuthorizationHeader();
    console.log('Auth Header', authorizationHeader);
    expect(authorizationHeader).to.not.equal(null);

    const orders = await fetch('url',
      {
        method: 'GET', headers: {
          authorization: authorizationHeader
        }
      });

    // tslint:disable-next-line:no-console
    console.log(await orders.json());
  });
});

Und meine Hilfsfunktionen in der BaseSteps.ts sind wie folgt:

 async loginUser(userName: string, password: string): Promise<Response> {
    const getSignInFormResponse = await fetch(this.getInitialRequestUrl(),
      {
        method: 'GET'
      });

    const form = <some-form-data>;

    const loginResponse = await fetch(getSignInFormResponse.url,
      {
        method: 'POST',
        headers: {
          'content-type': 'application/x-www-form-urlencoded'
        },
        body: form,
        redirect: 'manual'
      });

      return loginResponse;
  }

async getAuthorizationHeader() {
    const tokenResponse = await fetch(this.getInitialRequestUrl(),
      {
        method: 'GET',
        redirect: 'manual'
      });

    const tokenInfo = qs.parse(tokenResponse.headers.get('location'));
    const authorizationHeader = `${tokenInfo.token_type} ${tokenInfo.access_token}`;

    return authorizationHeader;
  }

Wenn ich mein Szenario ausführe, schlägt es mit dem folgenden Fehler fehl:

Error: function uses multiple asynchronous interfaces: callback and promise

auf der Linie, wo mein Gegebenes beginnt

Bitte helfen Sie mir, diesen Fehler zu beheben.

Hilfreichster Kommentar

Ihre Given Schrittdefinition hat ein table Argument, während sie in Ihrer Feature-Datei keine Tabelle enthält. Cucumber-js bestimmt anhand der Anzahl der Argumente in Ihrer Schrittdefinition, ob Sie die callback Schnittstelle verwenden. Wenn die Zahl um eins höher ist als die Anzahl der übergebenen Argumente, wird davon ausgegangen, dass Sie die Callback-Schnittstelle verwenden. Da Sie auch ein Promise zurückgeben, wird festgestellt, dass Sie die Promise-Schnittstelle verwenden. Es kann immer nur eine Schnittstelle gleichzeitig verwendet werden.

Denken Sie daran, die Fehlermeldung zu aktualisieren, um etwas über die Tatsache aufzunehmen, dass die Callback-Schnittstelle angenommen wird, weil die Schrittdefinition X Argumente hat?

Alle 7 Kommentare

Ihre Given Schrittdefinition hat ein table Argument, während sie in Ihrer Feature-Datei keine Tabelle enthält. Cucumber-js bestimmt anhand der Anzahl der Argumente in Ihrer Schrittdefinition, ob Sie die callback Schnittstelle verwenden. Wenn die Zahl um eins höher ist als die Anzahl der übergebenen Argumente, wird davon ausgegangen, dass Sie die Callback-Schnittstelle verwenden. Da Sie auch ein Promise zurückgeben, wird festgestellt, dass Sie die Promise-Schnittstelle verwenden. Es kann immer nur eine Schnittstelle gleichzeitig verwendet werden.

Denken Sie daran, die Fehlermeldung zu aktualisieren, um etwas über die Tatsache aufzunehmen, dass die Callback-Schnittstelle angenommen wird, weil die Schrittdefinition X Argumente hat?

@charlierudolph Hey Kumpel, danke für deine Antwort, aber ich habe nicht ganz verstanden, warum du gesagt hast, dass meine Feature-Datei keine Tabelle enthält?

  Given I login to my account with my username and password
    Then I should get an authorization token
      |username|password|
      |[email protected]|dev|

Wie übergeben wir die Tabelle nicht in der Feature-Datei?
Inspiriert von hier https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature

Ja die Fehlermeldung könnte etwas klarer sein..
Danke noch einmal.

Ich meinte, dass in Ihrer Feature-Datei Ihr Then Schritt eine Tabelle hat, aber Ihr Given Schritt nicht.

Ähh verdammt.. Ja, du hast recht.. Ich habe den Tisch für einen example sorry für die Verwirrung. Ich denke, es wäre jetzt in Ordnung. Wenn das Problem weiterhin besteht, werde ich wiederkommen, um Fragen zu stellen.

Das Schließen des Problems als @charlierudolph hat mir geholfen, meinen eigenen Codierungsfehler in der Feature-Datei herauszufinden.

Schön, dass es bei dir funktioniert. Ich werde ein separates Thema zum Aktualisieren der Fehlermeldung öffnen, um dies hoffentlich in Zukunft leichter herauszufinden

Dieser Thread wurde automatisch gesperrt, da nach dem Schließen in letzter Zeit keine Aktivität stattgefunden hat. Bitte öffnen Sie eine neue Ausgabe für verwandte Fehler.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen