Cucumber-js: خطأ: تستخدم الوظيفة واجهات متعددة غير متزامنة: رد الاتصال والوعد

تم إنشاؤها على ٣ يوليو ٢٠١٧  ·  7تعليقات  ·  مصدر: cucumber/cucumber-js

مرحبا بالجميع،
لدي حالة لا يمكنني فيها استخدام غير متزامن في تعريفات الخطوة.
لدي سيناريو بسيط حيث أقوم بتسجيل الدخول من خلال واجهة 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 من الوسائط؟

ال 7 كومينتر

لديك 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 في اكتشاف خطأ الترميز الخاص بي في ملف الميزة.

سعيد للعمل من أجلك. سأفتح مشكلة منفصلة لتحديث رسالة الخطأ على أمل تسهيل اكتشاف ذلك في المستقبل

تم قفل سلسلة الرسائل هذه تلقائيًا نظرًا لعدم وجود أي نشاط حديث بعد إغلاقه. الرجاء فتح قضية جديدة للأخطاء ذات الصلة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات