Hallo alle zusammen,
Ich habe einen Fall, in dem ich Async in den Schrittdefinitionen nicht verwenden kann.
Ich habe ein einfaches Szenario, in dem ich mich über die API-Schnittstelle meiner Anwendung anmelde, um das Authentifizierungstoken abzurufen
Meine Feature-Datei ist:
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|
meine schritte sind:
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());
});
});
Und meine Hilfsfunktionen in der BaseSteps.ts sind wie folgt:
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;
}
Wenn ich mein Szenario ausführe, schlägt es mit dem folgenden Fehler fehl:
Error: function uses multiple asynchronous interfaces: callback and promise
auf der Linie, wo mein Gegebenes beginnt
Bitte helfen Sie mir, diesen Fehler zu beheben.
Ihre Given
Schrittdefinition hat ein table
Argument, während sie in Ihrer Feature-Datei keine Tabelle enthält. Cucumber-js bestimmt anhand der Anzahl der Argumente in Ihrer Schrittdefinition, ob Sie die callback
Schnittstelle verwenden. Wenn die Zahl um eins höher ist als die Anzahl der übergebenen Argumente, wird davon ausgegangen, dass Sie die Callback-Schnittstelle verwenden. Da Sie auch ein Promise zurückgeben, wird festgestellt, dass Sie die Promise-Schnittstelle verwenden. Es kann immer nur eine Schnittstelle gleichzeitig verwendet werden.
Denken Sie daran, die Fehlermeldung zu aktualisieren, um etwas über die Tatsache aufzunehmen, dass die Callback-Schnittstelle angenommen wird, weil die Schrittdefinition X Argumente hat?
@charlierudolph Hey Kumpel, danke für deine Antwort, aber ich habe nicht ganz verstanden, warum du gesagt hast, dass meine Feature-Datei keine Tabelle enthält?
Given I login to my account with my username and password
Then I should get an authorization token
|username|password|
|[email protected]|dev|
Wie übergeben wir die Tabelle nicht in der Feature-Datei?
Inspiriert von hier https://github.com/cucumber/cucumber-js/blob/master/features/data_tables.feature
Ja die Fehlermeldung könnte etwas klarer sein..
Danke noch einmal.
Ich meinte, dass in Ihrer Feature-Datei Ihr Then
Schritt eine Tabelle hat, aber Ihr Given
Schritt nicht.
Ähh verdammt.. Ja, du hast recht.. Ich habe den Tisch für einen example
sorry für die Verwirrung. Ich denke, es wäre jetzt in Ordnung. Wenn das Problem weiterhin besteht, werde ich wiederkommen, um Fragen zu stellen.
Das Schließen des Problems als @charlierudolph hat mir geholfen, meinen eigenen Codierungsfehler in der Feature-Datei herauszufinden.
Schön, dass es bei dir funktioniert. Ich werde ein separates Thema zum Aktualisieren der Fehlermeldung öffnen, um dies hoffentlich in Zukunft leichter herauszufinden
Dieser Thread wurde automatisch gesperrt, da nach dem Schließen in letzter Zeit keine Aktivität stattgefunden hat. Bitte öffnen Sie eine neue Ausgabe für verwandte Fehler.
Hilfreichster Kommentar
Ihre
Given
Schrittdefinition hat eintable
Argument, während sie in Ihrer Feature-Datei keine Tabelle enthält. Cucumber-js bestimmt anhand der Anzahl der Argumente in Ihrer Schrittdefinition, ob Sie diecallback
Schnittstelle verwenden. Wenn die Zahl um eins höher ist als die Anzahl der übergebenen Argumente, wird davon ausgegangen, dass Sie die Callback-Schnittstelle verwenden. Da Sie auch ein Promise zurückgeben, wird festgestellt, dass Sie die Promise-Schnittstelle verwenden. Es kann immer nur eine Schnittstelle gleichzeitig verwendet werden.Denken Sie daran, die Fehlermeldung zu aktualisieren, um etwas über die Tatsache aufzunehmen, dass die Callback-Schnittstelle angenommen wird, weil die Schrittdefinition X Argumente hat?