مرحبا بالجميع،
لدي حالة لا يمكنني فيها استخدام غير متزامن في تعريفات الخطوة.
لدي سيناريو بسيط حيث أقوم بتسجيل الدخول من خلال واجهة 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
تعريف خطوة لديه 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
تعريف خطوة لديهtable
الحجة بينما في ملف ميزة الخاص بك، فإنه لايوجد الجدول. يحدد Cucumber-js ما إذا كنت تستخدم واجهةcallback
بناءً على عدد الوسائط في تعريف الخطوة الخاص بك. إذا كان الرقم أكثر من عدد الوسائط التي تم تمريرها ، فإنه يفترض أنك تستخدم واجهة رد الاتصال. نظرًا لأنك تعود أيضًا بوعد ، فهذا يحدد أنك تستخدم واجهة الوعد. يمكن استخدام واجهة واحدة فقط في كل مرة.أفكار حول تحديث رسالة الخطأ لتشمل شيئًا عن حقيقة أن واجهة رد الاتصال مفترضة لأن تعريف الخطوة يحتوي على عدد X من الوسائط؟