Cucumber-js: Erreur : la fonction utilise plusieurs interfaces asynchrones : rappel et promesse

Créé le 3 juil. 2017  ·  7Commentaires  ·  Source: cucumber/cucumber-js

Bonjour à tous,
J'ai un cas où je ne peux pas utiliser async dans les définitions d'étape.
J'ai un scénario simple où je me connecte via l'interface api de mon application pour récupérer le jeton d'authentification
Mon fichier caractéristique est :

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|

mes étapes sont :

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());
  });
});

Et mes fonctions d'assistance dans BaseSteps.ts sont les suivantes :

 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;
  }

Lorsque j'exécute mon scénario, il échoue avec l'erreur suivante :

Error: function uses multiple asynchronous interfaces: callback and promise

sur la ligne où commence mon Donné

Merci de m'aider à corriger cette erreur.

Commentaire le plus utile

Votre définition d'étape Given a un argument table alors que dans votre fichier de fonctionnalités, il n'a pas de table. Cucumber-js détermine si vous utilisez l'interface callback fonction du nombre d'arguments dans votre définition d'étape. Si le nombre est supérieur au nombre d'arguments transmis, cela suppose que vous utilisez l'interface de rappel. Étant donné que vous retournez également une promesse, cela détermine que vous utilisez l'interface de promesse. Une seule interface à la fois peut être utilisée.

Réflexions sur la mise à jour du message d'erreur pour inclure quelque chose sur le fait que l'interface de rappel est supposée parce que la définition de l'étape a un nombre X d'arguments ?

Tous les 7 commentaires

Votre définition d'étape Given a un argument table alors que dans votre fichier de fonctionnalités, il n'a pas de table. Cucumber-js détermine si vous utilisez l'interface callback fonction du nombre d'arguments dans votre définition d'étape. Si le nombre est supérieur au nombre d'arguments transmis, cela suppose que vous utilisez l'interface de rappel. Étant donné que vous retournez également une promesse, cela détermine que vous utilisez l'interface de promesse. Une seule interface à la fois peut être utilisée.

Réflexions sur la mise à jour du message d'erreur pour inclure quelque chose sur le fait que l'interface de rappel est supposée parce que la définition de l'étape a un nombre X d'arguments ?

@charlierudolph Salut

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

n'est-ce pas comment nous passons la table dans le fichier de fonctionnalités ?
Inspiré d'ici https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature

Oui, le message d'erreur pourrait être un peu plus clair.
Merci encore.

Je voulais dire que dans votre fichier de fonctionnalités, votre étape Then a une table mais pas votre étape Given .

Uhh putain.. Ouais tu as raison.. J'ai confondu la table avec un example désolé pour la confusion. Je suppose que ça irait bien maintenant. Si le problème persiste, je reviendrai pour poser à nouveau des questions.

La fermeture du problème en tant que @charlierudolph m'a aidé à comprendre ma propre erreur de codage dans le fichier de fonctionnalités.

Heureux que cela fonctionne pour vous. J'ouvrirai un autre numéro pour mettre à jour le message d'erreur afin, espérons-le, de le comprendre plus facilement à l'avenir

Ce fil a été automatiquement verrouillé car il n'y a eu aucune activité récente après sa fermeture. Veuillez ouvrir un nouveau problème pour les bogues liés.

Cette page vous a été utile?
0 / 5 - 0 notes