Bonjour à tous,
J'ai un cas où je ne peux pas utiliser async dans les définitions d'étape.
J'ai un scénario simple où je me connecte via l'interface api de mon application pour récupérer le jeton d'authentification
Mon fichier caractéristique est :
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|
mes étapes sont :
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());
});
});
Et mes fonctions d'assistance dans BaseSteps.ts sont les suivantes :
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;
}
Lorsque j'exécute mon scénario, il échoue avec l'erreur suivante :
Error: function uses multiple asynchronous interfaces: callback and promise
sur la ligne où commence mon Donné
Merci de m'aider à corriger cette erreur.
Votre définition d'étape Given
a un argument table
alors que dans votre fichier de fonctionnalités, il n'a pas de table. Cucumber-js détermine si vous utilisez l'interface callback
fonction du nombre d'arguments dans votre définition d'étape. Si le nombre est supérieur au nombre d'arguments transmis, cela suppose que vous utilisez l'interface de rappel. Étant donné que vous retournez également une promesse, cela détermine que vous utilisez l'interface de promesse. Une seule interface à la fois peut être utilisée.
Réflexions sur la mise à jour du message d'erreur pour inclure quelque chose sur le fait que l'interface de rappel est supposée parce que la définition de l'étape a un nombre X d'arguments ?
@charlierudolph Salut
Given I login to my account with my username and password
Then I should get an authorization token
|username|password|
|[email protected]|dev|
n'est-ce pas comment nous passons la table dans le fichier de fonctionnalités ?
Inspiré d'ici https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature
Oui, le message d'erreur pourrait être un peu plus clair.
Merci encore.
Je voulais dire que dans votre fichier de fonctionnalités, votre étape Then
a une table mais pas votre étape Given
.
Uhh putain.. Ouais tu as raison.. J'ai confondu la table avec un example
désolé pour la confusion. Je suppose que ça irait bien maintenant. Si le problème persiste, je reviendrai pour poser à nouveau des questions.
La fermeture du problème en tant que @charlierudolph m'a aidé à comprendre ma propre erreur de codage dans le fichier de fonctionnalités.
Heureux que cela fonctionne pour vous. J'ouvrirai un autre numéro pour mettre à jour le message d'erreur afin, espérons-le, de le comprendre plus facilement à l'avenir
Ce fil a été automatiquement verrouillé car il n'y a eu aucune activité récente après sa fermeture. Veuillez ouvrir un nouveau problème pour les bogues liés.
Commentaire le plus utile
Votre définition d'étape
Given
a un argumenttable
alors que dans votre fichier de fonctionnalités, il n'a pas de table. Cucumber-js détermine si vous utilisez l'interfacecallback
fonction du nombre d'arguments dans votre définition d'étape. Si le nombre est supérieur au nombre d'arguments transmis, cela suppose que vous utilisez l'interface de rappel. Étant donné que vous retournez également une promesse, cela détermine que vous utilisez l'interface de promesse. Une seule interface à la fois peut être utilisée.Réflexions sur la mise à jour du message d'erreur pour inclure quelque chose sur le fait que l'interface de rappel est supposée parce que la définition de l'étape a un nombre X d'arguments ?