Cucumber-js: Erro: a função usa várias interfaces assíncronas: retorno de chamada e promessa

Criado em 3 jul. 2017  ·  7Comentários  ·  Fonte: cucumber/cucumber-js

Olá pessoal,
Eu tenho um caso em que não consigo usar assíncrono nas definições de etapa.
Eu tenho um cenário simples em que estou fazendo login por meio da interface api do meu aplicativo para buscar o token de autenticação
Meu arquivo de recurso é:

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|

meus passos são:

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

E minhas funções auxiliares no BaseSteps.ts são as seguintes:

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

Quando executo meu cenário, ele falha com o seguinte erro:

Error: function uses multiple asynchronous interfaces: callback and promise

na linha onde meu dado começa

Por favor me ajude a corrigir esse erro.

Comentários muito úteis

Sua definição de etapa Given tem um argumento table enquanto em seu arquivo de feição, ela não tem uma tabela. Cucumber-js determina se você está usando a interface callback base no número de argumentos em sua definição de etapa. Se o número for um a mais do que o número de argumentos transmitidos, será assumido que você está usando a interface de retorno de chamada. Como você também está retornando uma promessa, isso determina que você está usando a interface de promessa. Apenas uma interface por vez pode ser usada.

Você tem ideias sobre como atualizar a mensagem de erro para incluir algo sobre o fato de que a interface de retorno de chamada é assumida porque a definição da etapa tem um número X de argumentos?

Todos 7 comentários

Sua definição de etapa Given tem um argumento table enquanto em seu arquivo de feição, ela não tem uma tabela. Cucumber-js determina se você está usando a interface callback base no número de argumentos em sua definição de etapa. Se o número for um a mais do que o número de argumentos transmitidos, será assumido que você está usando a interface de retorno de chamada. Como você também está retornando uma promessa, isso determina que você está usando a interface de promessa. Apenas uma interface por vez pode ser usada.

Você tem ideias sobre como atualizar a mensagem de erro para incluir algo sobre o fato de que a interface de retorno de chamada é assumida porque a definição da etapa tem um número X de argumentos?

@charlierudolph Ei amigo, obrigado por sua resposta, mas eu não entendi muito bem por que você disse que meu arquivo de recurso não tem uma tabela nele?

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

não é como passamos a tabela no arquivo de feições?
Busquei inspiração aqui https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature

Sim, a mensagem de erro poderia ser um pouco mais clara ..
Obrigado novamente.

Eu quis dizer que em seu arquivo de feição, sua etapa Then tem uma tabela, mas sua etapa Given não.

Uhh droga .. Sim, você está certo .. Eu confundi a mesa com uma example desculpe a confusão. Eu acho que tudo ficaria bem agora. Se o problema persistir, voltarei para fazer perguntas novamente.

Fechar o problema como @charlierudolph me ajudou a descobrir meu próprio erro de codificação no arquivo de recurso.

Ainda bem que está trabalhando para você. Abrirei um problema separado para atualizar a mensagem de erro para tornar isso mais fácil de descobrir no futuro

Este tópico foi bloqueado automaticamente, pois não houve nenhuma atividade recente depois que ele foi fechado. Abra um novo problema para bugs relacionados.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kozhevnikov picture kozhevnikov  ·  6Comentários

igniteram picture igniteram  ·  7Comentários

jechazelle picture jechazelle  ·  5Comentários

NoNameProvided picture NoNameProvided  ·  5Comentários

Niceplace picture Niceplace  ·  4Comentários