Cucumber-js: منسق JSON: تكدس السجلات استثناء التتبع ويجب أن تسجل أخطاء تأكيدات الخيار

تم إنشاؤها على ١٩ أكتوبر ٢٠١٧  ·  12تعليقات  ·  مصدر: cucumber/cucumber-js

أهلا،

أعتقد أن هناك خطأ في "json_formatter.js" في السطر 213 ، انظر المقتطف أدناه:

    if (status === _status2.default.FAILED && exception) {
      data.result.error_message = exception.stack || exception;
    }

سيؤدي أي اختبار فاشل إلى تسجيل تتبع المكدس عندما يجب أن يكون IMO هو الاستثناء.

هل يمكن لأي شخص تأكيد ما إذا كان هذا خطأ وكيف سيتم حله.

أنا أدير NightwatchJS مع CucumberJS ، تفاصيل بيئتي هي كما يلي:

العقدة - v8.7.0
الخيار - v3.03
الساعة الليلية - v0.9.16
خيار Nightwatch - v8.2.2
المتصفح - Chrome v61.0.3163.100
برنامج تشغيل كروم - v2.32
السيلينيوم - v3.5.3
نظام التشغيل - Windows 7

لقد أرفقت نسخة من مخرجات منسق json تعرض رسالة الخطأ في السطر 86

يعتبر،
نيفيل همفري

chrome.cucumber.json.zip

التعليق الأكثر فائدة

مرحبًا finaruioana ،

في نسختك المحلية من cucumber / lib / formatter / json_formatter.js ، يمكنك اختبار ما إذا كان تغيير السطر 213 إلى ما يلي مناسبًا لك:

      let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
      error_message += exception.stack;
      data.result.error_message = error_message || exception;

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

ال 12 كومينتر

لم يرى أحد هذا الخطأ؟

أنا أؤكد أن هذا خطأ. يجب أن يكون سطر الكود في json_formatter @ 213:

      data.result.error_message = exception.message + exception.stack;

و لا

  data.result.error_message = exception.stack || exception;

بهذه الطريقة تحصل على خطأ التأكيد وتتبع المكدس.

لقد رأيت نفس المشكلة ، من فضلك هل يمكن لشخص أن يؤكد أن هذا خطأ؟

إنها تجربتي في الكروم والعقدة أن Error: <message> هو السطر الأول من المكدس. Error: <message> هو نتيجة error.toString() . يمكننا استخدام شيء مثل:

let msg = exception
if (exception.stack) {
  msg = exception.stack
  if (!_.includes(msg, error.toString()) {
    msg = error.toString() + '\n' + msg
  }
}
data.result.error_message = msg

يمكن تأكيد أن المكدس لا يتضمن الرسالة في سفاري. أرى الرسالة في المكدس في الكروم 61 والعقدة 8.

أواجه نفس المشكلة باستخدام خيار الساعة الليلية (غالبًا ما يؤدي الفشل إلى ظهور رسالة خطأ بدون مكدس). إنها حشرة بالنسبة لي

let error_message = _.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;

إذا تم تضمين رسالة الاستثناء في المكدس ، فقد يوفر هذا الحل error_message بدون تكرار. وإلا يتم وضع رسالة الاستثناء من قبل.

أهلا،

لدينا مشكلة مماثلة في نفس السطر ، ولكن بسبب نوع هذا العنصر.
في ملف تقرير json الذي تم إنشاؤه ، يكون error_message عبارة عن سلسلة أو كائن. هل يمكن أن يكون لدينا تناسق هنا؟ في انتظار سماع افكار الناس حولها.

المشكلة بالنسبة لنا هي عندما نحاول إنشاء تقرير html من json. في هذه اللحظة ، تتوقع مكتبة cucumber-html-reporter أن تكون رسالة error هذه سلسلة. عندما نحصل عليه ككائن ، يفشل مراسل HTML.

للمضي قدمًا ، حصلنا على هذا النوع من الاختلاف بسبب الاختبارات التي تستخدم مكتبات مستعرضات مختلفة. متى نجري الاختبارات باستخدام webdriverio ، يمر إنشاء التقرير. ولكن باستخدام webdriverjs-angular ، سيحتوي التقرير report.json على error_message ككائن وبالتالي الفشل عند إنشاء تقرير html.

بناءً على ردك ، قد أحتاج إلى إثارة المشكلة في مكان مختلف ، لكنني اعتقدت أن أفضل مكان للبدء بهذا هو معرفة ما إذا كان يمكن أن يكون لدينا اتساق على نوع error_message.

شكرا!

مرحبًا finaruioana ،

في نسختك المحلية من cucumber / lib / formatter / json_formatter.js ، يمكنك اختبار ما إذا كان تغيير السطر 213 إلى ما يلي مناسبًا لك:

      let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
      error_message += exception.stack;
      data.result.error_message = error_message || exception;

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

مرحبا @ humphreyn

في الواقع ، أدى إجراء التغييرات المذكورة أعلاه إلى حل مشكلتي. أود أيضًا إضافة علامة if على المكدس قبل إلحاقها ، في حالتي كانت الحاق غير محدد.
javascript let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n'; if (exception.stack) { error_message += exception.stack; } data.result.error_message = error_message || exception;

شكرا!

لقد اعتبرت أن هذا الاستثناء هو كائن مع تعريف الرسالة والمكدس ، ولكن إذا لم يكن هذا هو الحال دائمًا ، فستكون هناك حاجة إلى تعديل صغير:

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;

يمنع هذا الرمز "غير محدد" من أن تتم إضافته إلى error_message إذا لم يتم تعريف الرسالة أو المكدس. إذا كان كلاهما سلسلة فارغة أو غير محددة يتم تعيين كائن الاستثناء إلى error_message. إذا أردنا فرض سلسلة error_message ، فيمكننا استخدام JSON.stringify :

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || JSON.stringify(exception);

finaruioana ، تعتقد أن هذا الحل سيكون _lodash بدلاً من _ )

let msg = exception.message || '';
let stack = exception.stack || '';
msg = _lodash.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;

نعم ، تبدو جيدةinnocentiv. اختبرته ويبدو أنه يعمل بشكل جيد.

innocentiv ، يمكنني أيضًا أن أؤكد أن هذه التغييرات تعمل محليًا بالنسبة لي في chrome ، أي وفايرفوكس
nodejs: v8.9.0
cucumberjs: v 3.1.0
ساعة-خيار: v0.9.16.0
عنصر السيلينيوم المستقل: v3.4.0
أي webdriver: v3.4.0
محرك الويب كروم: v2.33
أبو بريص (فايرفوكس) webdriver: v0.19.1

هل سترسل طلب سحب لتطبيق هذا الإصلاح؟

humphreyn طلب السحب: # 973

لقد قمت للتو بتعديل طلب السحب للتحقق من استثناء السلسلة. يمكنك اختباره محليًا باستخدام:

          if (_lodash2.default.isString(exception)) {
            data.result.error_message = exception;
          } else {
            var _exception$message = exception.message,
                message = _exception$message === undefined ? '' : _exception$message,
                _exception$stack = exception.stack,
                stack = _exception$stack === undefined ? '' : _exception$stack;

            message = _lodash2.default.includes(stack, message) ? '' : message + '\n';
            data.result.error_message = message + stack || JSON.stringify(exception);
          }

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

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