Cucumber-js: Ошибка: функция использует несколько асинхронных интерфейсов: обратный вызов и обещание

Созданный на 3 июл. 2017  ·  7Комментарии  ·  Источник: cucumber/cucumber-js

Всем привет,
У меня есть случай, когда я не могу использовать async в определениях шагов.
У меня есть простой сценарий, когда я вхожу в систему через интерфейс api моего приложения, чтобы получить токен аутентификации
Мой файл функций:

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|

мои шаги:

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

И мои вспомогательные функции в BaseSteps.ts следующие:

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

Когда я запускаю свой сценарий, он выходит из строя со следующей ошибкой:

Error: function uses multiple asynchronous interfaces: callback and promise

на линии, где начинается мой данный

Пожалуйста, помогите мне исправить эту ошибку.

Самый полезный комментарий

В вашем определении Given step есть аргумент table тогда как в вашем файле функций у него нет таблицы. Cucumber-js определяет, используете ли вы интерфейс callback на основе количества аргументов в определении вашего шага. Если это число на единицу больше, чем количество переданных аргументов, то предполагается, что вы используете интерфейс обратного вызова. Поскольку вы также возвращаете обещание, он определяет, что вы используете интерфейс обещания. Одновременно можно использовать только один интерфейс.

Мысли об обновлении сообщения об ошибке, чтобы включить что-то о том факте, что интерфейс обратного вызова предполагается, потому что определение шага имеет X аргументов?

Все 7 Комментарий

В вашем определении Given step есть аргумент table тогда как в вашем файле функций у него нет таблицы. Cucumber-js определяет, используете ли вы интерфейс callback на основе количества аргументов в определении вашего шага. Если это число на единицу больше, чем количество переданных аргументов, то предполагается, что вы используете интерфейс обратного вызова. Поскольку вы также возвращаете обещание, он определяет, что вы используете интерфейс обещания. Одновременно можно использовать только один интерфейс.

Мысли об обновлении сообщения об ошибке, чтобы включить что-то о том факте, что интерфейс обратного вызова предполагается, потому что определение шага имеет X аргументов?

@charlierudolph Привет, приятель, спасибо за ответ, но я не совсем понял, почему ты сказал, что в моем файле функций нет таблицы?

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

Разве мы не передаем таблицу в файл функций?
Черпал вдохновение здесь https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature

Да, сообщение об ошибке могло бы быть более ясным ...
Спасибо еще раз.

Я имел в виду, что в вашем файле функций Then шаге Given - нет.

Эээ, черт .. Да вы правы .. Я принял стол за example извините за путаницу. Думаю, сейчас все будет хорошо. Если проблема не исчезнет, ​​я вернусь, чтобы задать вопросы еще раз.

Закрытие проблемы, поскольку @charlierudolph помогло мне выяснить мою собственную ошибку кодирования в файле функций.

Рад, что он работает на вас. Я открою отдельную проблему для обновления сообщения об ошибке, чтобы, надеюсь, упростить это в будущем.

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги