Cucumber-js: Error: la función usa múltiples interfaces asincrónicas: devolución de llamada y promesa

Creado en 3 jul. 2017  ·  7Comentarios  ·  Fuente: cucumber/cucumber-js

Hola, todos,
Tengo un caso en el que no puedo usar async en las definiciones de pasos.
Tengo un escenario simple en el que estoy iniciando sesión a través de la interfaz api de mi aplicación para obtener el token de autenticación
Mi archivo de características es:

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|

mis pasos son:

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

Y mis funciones de ayuda en BaseSteps.ts son las siguientes:

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

Cuando ejecuto mi escenario, falla con el siguiente error:

Error: function uses multiple asynchronous interfaces: callback and promise

en la línea donde comienza mi dado

Ayúdame a corregir este error.

Comentario más útil

Su definición de paso Given tiene un argumento table mientras que en su archivo de características, no tiene una tabla. Cucumber-js determina si está utilizando la interfaz callback en función del número de argumentos en su definición de paso. Si el número es uno más que el número de argumentos que se pasan, se supone que está utilizando la interfaz de devolución de llamada. Dado que también está devolviendo una promesa, determina que está utilizando la interfaz de promesa. Solo se puede utilizar una interfaz a la vez.

¿Piensa actualizar el mensaje de error para incluir algo sobre el hecho de que se asume la interfaz de devolución de llamada porque la definición del paso tiene X número de argumentos?

Todos 7 comentarios

Su definición de paso Given tiene un argumento table mientras que en su archivo de características, no tiene una tabla. Cucumber-js determina si está utilizando la interfaz callback en función del número de argumentos en su definición de paso. Si el número es uno más que el número de argumentos que se pasan, se supone que está utilizando la interfaz de devolución de llamada. Dado que también está devolviendo una promesa, determina que está utilizando la interfaz de promesa. Solo se puede utilizar una interfaz a la vez.

¿Piensa actualizar el mensaje de error para incluir algo sobre el hecho de que se asume la interfaz de devolución de llamada porque la definición del paso tiene X número de argumentos?

@charlierudolph Hola amigo, gracias por tu respuesta, pero no entendí bien por qué dijiste que mi archivo de características no tiene una tabla.

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

¿No es cómo pasamos la tabla en el archivo de características?
Me inspiré en aquí https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature

Sí, el mensaje de error podría ser un poco más claro ...
Gracias de nuevo.

Quise decir que en su archivo de características, su paso Then tiene una tabla, pero su paso Given no la tiene.

Maldita sea ... Sí, tienes razón ... Confundí la mesa con un example perdón por la confusión. Supongo que ahora estaría bien. Si el problema persiste, volveré para hacer preguntas nuevamente.

Cerrar el problema como @charlierudolph me ayudó a descubrir mi propio error de codificación en el archivo de características.

Me alegro de que funcione para ti. Abriré un problema separado para actualizar el mensaje de error y, con suerte, facilitará la comprensión en el futuro.

Este hilo se ha bloqueado automáticamente ya que no ha habido ninguna actividad reciente después de que se cerró. Abra un nuevo problema para errores relacionados.

¿Fue útil esta página
0 / 5 - 0 calificaciones