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.
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.
Comentários muito úteis
Sua definição de etapa
Given
tem um argumentotable
enquanto em seu arquivo de feição, ela não tem uma tabela. Cucumber-js determina se você está usando a interfacecallback
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?