Всем привет,
У меня есть случай, когда я не могу использовать 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 аргументов?
@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 помогло мне выяснить мою собственную ошибку кодирования в файле функций.
Рад, что он работает на вас. Я открою отдельную проблему для обновления сообщения об ошибке, чтобы, надеюсь, упростить это в будущем.
Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.
Самый полезный комментарий
В вашем определении
Given
step есть аргументtable
тогда как в вашем файле функций у него нет таблицы. Cucumber-js определяет, используете ли вы интерфейсcallback
на основе количества аргументов в определении вашего шага. Если это число на единицу больше, чем количество переданных аргументов, то предполагается, что вы используете интерфейс обратного вызова. Поскольку вы также возвращаете обещание, он определяет, что вы используете интерфейс обещания. Одновременно можно использовать только один интерфейс.Мысли об обновлении сообщения об ошибке, чтобы включить что-то о том факте, что интерфейс обратного вызова предполагается, потому что определение шага имеет X аргументов?