Jest: لا يصدر console.log الإخراج

تم إنشاؤها على ١٩ يونيو ٢٠١٧  ·  137تعليقات  ·  مصدر: facebook/jest

يرجى تجربة Jest 24 إذا كنت تواجه مشكلات في فقد console.log الناتج


المتفرعة من العدد 2441

cpojer لا أرى أي إخراج console.log مع هذا الإعداد (macOS):

$ node --version
v7.4.0

الملفات

package.json :

{
  "dependencies": {
    "@types/jest": "19.2.4",
    "jest": "20.0.4",
    "ts-jest": "20.0.6",
    "typescript": "2.3.4"
  }
}

__tests__/jestconfig.json :

{
  "rootDir": "../",
  "globals": {
    "__TS_CONFIG__": {}

  },
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js",
    "jsx",
    "json"
  ],
  "transform": {
    "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
  },
  "testRegex": "__tests__/.*test_.*\\.(ts|tsx|js)$"

__tests__/test_foo.ts :

import {} from 'jest';

console.log('CONSOLE before test');
test('fail', () => {
  console.log('CONSOLE inside test');
  expect(true).toEqual(false);
  console.log('CONSOLE end of test');
})

__tests__/test_bar.js :

console.log('BAR CONSOLE before test');
test('fail', () => {
  console.log('BAR CONSOLE inside test');
  expect(true).toEqual(false);
  console.log('BAR CONSOLE end of test');
})

انتاج |

$ jest -c __tests__/jestconfig.json 
 FAIL  __tests__/test_foo.ts
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous> (__tests__/test_foo.ts:6:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

 FAIL  __tests__/test_bar.js
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous>.test (__tests__/test_bar.js:4:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

Test Suites: 2 failed, 2 total
Tests:       2 failed, 2 total
Snapshots:   0 total
Time:        1.379s
Ran all test suites.

اختبار JS واحد:

$ jest -c __tests__/jestconfig.json __tests__/test_bar.js 
 FAIL  __tests__/test_bar.js
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous>.test (__tests__/test_bar.js:4:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  ✕ fail (7ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        0.596s, estimated 1s
Ran all test suites matching "__tests__/test_bar.js".

اختبار TS واحد:

$ jest -c __tests__/jestconfig.json __tests__/test_foo.ts 
 FAIL  __tests__/test_foo.ts
  ● fail

    expect(received).toEqual(expected)

    Expected value to equal:
      false
    Received:
      true

      at Object.<anonymous> (__tests__/test_foo.ts:6:16)
      at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)

  ✕ fail (116ms)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        1.27s
Ran all test suites matching "__tests__/test_foo.ts".
Confirmed

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

سنتان من عدم وجود سجلات وحدة التحكم جعلتني مطورًا أفضل. شكرا فريق Jest!

ال 137 كومينتر

thymikee أي فكرة لماذا يحدث هذا؟

لا توجد فكرة ، لكنني سأحاول تصغير المثال ، على سبيل المثال عن طريق إزالة الكتابة المطبوعة

أنا قادر على إعادة النسخ بدون تنقيح الكتابة

يمكن تأكيد أن Node 7.4 يأكل سجلات وحدة التحكم ، لكنه يعمل على Node 7.5.0 و 7.10.0 و 8.0.0 و 8.1.2.
الرجاء ترقية إصدار Node الخاص بك. إغلاق

thymikee ماذا عن Node 6 ، وهو إصدار LTS الحالي؟ (يبدو أنني أضرب هذا أيضًا ، على الرغم من أنني لم أصححه بشكل كافٍ حتى الآن. ومع ذلك ، فأنا مقيد بإصدارات LTS في الوقت الحالي ، لذا لا يمكنني الترقية).

تم اختباره على الإصدار 6.11.0 ، ولا يزال يظهر console.log s.

آه ، ربما أواجه مشكلة أخرى. شكرًا ، thymikee ، سأعود إلى تصحيح الأخطاء أكثر قليلاً.

كنت أقوم بتشغيل Node 7.3.0 دون علمي (إصدار خاطئ عبر n) ولم يكن يسجل. تحول إلى 8.1.1 وقام بتسجيل الدخول مرة أخرى.

thymikee - لا أرى كيف يكون هذا هو الحل؟ ... لا يمكنني ترقية إصدار العقدة الخاصة بي

أعتقد أنني مرتبك قليلاً كيف يمكن اعتبار هذا خطأ في العقدة وليس على الأقل علاقة بـ Jest نفسها. باستخدام Node v7.4.0 ، مع Jest v19.0.2 أرى تسجيل وحدة التحكم من اختباراتي. ببساطة تحديث Jest إلى الإصدار 20.0.4 (بدون إجراء أي تغييرات على أي تكوين آخر) يؤدي إلى عدم ظهور تسجيل وحدة التحكم. هل هناك شيء مفقود؟

thymikee لذا ، لقد قمت بترقية إصدار العقدة الخاصة بي ولا أرى أي سجلات وحدة تحكم على Node 8.2.1 Winx64 + Jest 20.0.4. لا بد لي من استخدام احتياطي الآن

  console.log = s => {
    process.stdout.write(s + "\n");
  };

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

nowherenone هل يمكنك اختبار ما إذا كان يحدث في أحدث إصدار ألفا jest@test ؟

thymikee حاولت للتو باستخدام jest@test على العقدة 8.2.1 لكن النتيجة نفسها. يتم دائمًا ابتلاع بيانات console.log .

thymikee تكمن المشكلة في الوحدة النمطية BufferedConsole ، حيث لا تتطابق معلمات مُنشئ وحدة التحكم مع المعلمات المتوقعة.

لقد فتحت علاقات عامة ، ربما من المفيد: https://github.com/facebook/jest/pull/4157

أعتقد أن المشكلة هنا هي أن Jest تقوم بتخزين الرسائل مؤقتًا ولكن هناك شيء يتسبب في الإنقاذ (أو حلقة لا نهائية وما إلى ذلك). ستحتاج إلى استخدام --verbose لطباعة الرسائل مباشرة إلى تدفق الإخراج.

هذا أمر مثير للسخرية - لقد أثارني مقدار الردود غير المجدية من cpojer (في كل قضية والعلاقات العامة التي أذهب إليها) وأحاول وضع كل شيء على أي شخص آخر بطريقة ما لسنا أذكياء بما فيه الكفاية.

لا تستخدم Jest - هذا هو جوابي إذا كنت تتساءل. ابحث عن إطار عمل اختبار جديد.

describe('index', () => {
  it('doesnt print anything', () => {
    console.log('Hellllooo');
    expect(true).toBe(true);
  });
});
$ yarn test -- src/__tests__/index.spec.js --verbose
yarn test v0.27.5
warning package.json: No license field
$ jest "src/__tests__/index.spec.js" "--verbose"
 PASS  src/__tests__/index.spec.js
  Index
    ✓ doesnt print anything (2ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.969s, estimated 2s
$ jest "--version"
v20.0.4
$ node --version
v7.4.0

أنا متأكد من أنه سيتم إخباري فقط بتثبيت إصدار أحدث من Node Lmao - يا لها من مزحة 😂 😂 😂

@ nf071590 لا يمكنه التراجع ، يعمل على repl.it مع نفس إصدارات Jest و Node بالضبط: https://repl.it/KYLc/0

يرجى الخروج بتوبيخ جاد قبل الصراخ حول المشرفين على المشروع.
هتافات!

screen shot 2017-08-24 at 17 39 59

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

screen shot 2017-08-24 at 4 38 11 pm

رمي منذ أن كنت على windows (العقدة 8.4 ، jest 21.0.0-alpha.2) ، console.log s _ في بعض الأحيان _ مخفي إذا كنت لا تستخدم --verbose ، ولكن يبدو أنه يظهر باستمرار معها. يسعدني تحديث النتائج باستخدام العقدة 7 والمزحة الثابتة عندما أحصل على دقيقة.

نفس المشكلة هنا.

describe('index', () => {
  it('doesnt print anything', () => {
    console.log('Hellllooo');
    expect(true).toBe(true);
  });
});
$ node --version
v7.4.0
$ jest "--version"
v21.1.0

screen shot 2017-09-21 at 14 34 32

تواجه حاليًا نفس المشكلة على العقدة v8.7.0 (npm v5.4.2).

وما زالت هذه المسألة

هل يمكنك تقديم استنساخ؟

FWIW ، انتهى بي الأمر هنا لأنني كنت أعاني من نفس المشكلة بالضبط. العقدة v7.4.0. تمت ترقية إصدار Node الخاص بي ، وتمت طباعة console.log كما هو متوقع الآن ، حتى بدون --verbose . قد لا يكون V7.4.0 هو الإصدار الوحيد الذي لديه هذه المشكلة ، ولكن يبدو أنه مرتبط بالإصدار ، ولا يمثل مشكلة بالنسبة لبعض إصدارات Node. أنا الآن على Node v8.3.0 ، والذي يبدو أنه يعمل.

ومع ذلك ، قبل الترقية كان لدي نفس الإصدارات مثل @ nf071590 ، ونفس المشاكل. لست متأكدًا من سبب عدم حدوث ذلك في repl.it ، لكنه ليس شيئًا غريبًا يحدث فقط على جهاز الكمبيوتر الخاص به.

يمكنني إعادة إنتاج هذا باستخدام العقدة 8.9.0 و jest 21.2.1 و macOS 10.12.6 (16G1036)

SimenB يمكنني ولكن يبدو أن هذه القضية قد نوقشت حتى الموت هنا وفي أي مكان آخر. تعني طبيعة العملية المتعددة (الفرعية) للمزح أنها ستكتب فوق console.logs ، وبدون إعادة كتابة ضخمة لن تتغير. أي شخص يأتي إلى هذا الموضوع ويريد تجنب المشكلة حيث لا يسمح استخدام علامة --verbose تصحيح الأخطاء باستخدام console.log ، يجب أن يستخدم علامة --watch . سيؤدي هذا إلى تجنب الكتابة فوق عمليات العامل الفرعي ويسمح لك برؤية إخراج مطول مع سجلات وحدة التحكم. --watch سريع جدًا ويضيف قيمة أكبر من خلال تركيز الانتباه على الاختبارات والتعليمات البرمجية التي تغيرت ، عن طريق تشغيل تلك الاختبارات التي تم تغييرها عند الحفظ فقط.

في حالتي ، وجدت أن الرسائل المطولة قد تأكل بعضًا وليس كل رسائل console.log . لقد أزلت الخيار المطول ويبدو أنه يعمل إلى حد ما!

لقد قمت للتو بترقية إصدار العقدة الخاصة بي من v6 إلى v9 وأحد ملفات الاختبار الخاصة بي يواسي.

لقد كنت أواجه صعوبة في حل هذه المشكلة منذ أسابيع. أنا سعيد لأنه يعمل الآن

لا تزال المشكلة قائمة مع --verbose عند دمجها مع --forceExit - أعتقد أن السبب في ذلك هو أن console.log مخرجات إلى stdout بينما تكتب الدعابة إلى stderr وعندما --forceExit قد يظل هناك محتوى في stdout لم يتم مسحه

لقد وجدت الحل التالي (بدون الحاجة إلى --verbose ) لإصلاح كل من console.log لا يظهر و / أو console.log يجري تخزينه مؤقتًا ولا يتم عرضه مباشرة

أمر
jest .... --forceExit --setupTestFrameworkScriptFile ./src/tests/jestShim.js

محتويات jestShim.js

const { Console } = require('console');
global.console = new Console(process.stderr, process.stderr);

نفس المشكلة - لا ترى إخراج console.log أبدًا.

Node 9.80 Jest 22.4.2 Mac OS 10.13.3

لم تنجح أي من الحلول البديلة المقترحة هنا بالنسبة لي.

كما هو الحال دائمًا ، يرجى إنشاء نسخة يمكننا سحبها لأسفل للاختبار. لم أواجه هذه المشكلة ، لذلك لست متأكدًا من كيفية البدء في إصلاحها

الحل البديل لـ ledbit يعمل بالنسبة لي
NPM 5.3.0
jest 22.4.3

  • نظام التشغيل Mac OS

ما زلت على وشك الحاجة إلى التكاثر.

يبدو أن --forceExit معطل إلى حد ما ، لكني لم أواجهه عند عدم استخدام هذا العلم

[استخدام متشعب react-scripts لاستخدام أحدث إصدار من Jest v23.0.0 ، العقدة v8.11.2]

أخيرًا حصلت على السجلات لتظهر من خلال وضع علامات على كل منها بسلسلة معينة من الأحرف (على سبيل المثال @@@ ) وتشغيل:

yarn test --verbose | grep '@@@'

إنه اختراق رهيب (تفقد كل ألوان وحدة التحكم ، لكنك لا تزال ترى إخفاقات في الاختبار وملخص اختبار نهائي) ولكنه الشيء الوحيد الذي نجح حتى الآن. لقد جربت كل شيء آخر في التعليقات أعلاه. لاحظ أن --verbose arg ضروري لهذا الحل (ويتم دمجه ضمنيًا مع --watch عبر react-scripts ).

وما زالت هذه المسألة. أنا أستخدم jest v22.4.3 على Node 10.1.0 وأرى فقط أول بيان console.log من تطبيقي ، ويتم تجاهل كل الباقي. عندما أقوم بتعيين مكتبة التسجيل الخاصة بي على البث على stdout ، يمكنني رؤية بعض السجلات ولكنها لا تظهر بالترتيب الصحيح.

تتمثل وظيفة Jest كجهاز اختبار في مساعدتنا في تصحيح أخطاء التعليمات البرمجية الخاصة بنا وإصلاحها. لا يمكن تحقيق ذلك ببساطة بدون سجلات.

thymikee الرجاء إعادة فتح هذه المشكلة

thanpolas لا تتردد في إنشاء إصدار جديد مع مستودع يعرض الخطأ حتى نتمكن من التحقيق :). أيضًا ، يرجى استخدام Jest 23 ، لأن هذا هو الأحدث.

اكتشفت مشكلتي ، كان التسجيل يحدث من خلال جهاز تسجيل كان يتدفق إلى stdout ، عند إعادة توجيهي إلى console.log نسيت استدعاء رد كاتب الدفق حتى توقف الدفق عن إرسال السجلات.

لما يستحق ، رأيت اختلافات بين Terminal و iTerm2.

أعتقد أن خيارًا لتوجيه الدعابة إلى عدم القيام بالسحر على stdout ووحدة التحكم سيكون مفيدًا جدًا للجميع

هذا مثال واحد للخطأ الذي تمكنت من إعادة إنتاجه. لست متأكدًا مما إذا كانت هناك مصادر متعددة على الرغم من:

https://github.com/spion/jest-logging-repro

yarn install; yarn repro

الإعداد: Jest في وضع المراقبة ، مع تشغيل العلم المطول ، مع تشغيل ملفي اختبار على الأقل.

النظرية: يحرك الإخراج من أحد العاملين مؤشر وحدة التحكم إلى المكان الخطأ للكتابة فوق محتوى خاطئ.

المراقبة في وحدة التحكم:

 RUNS  tests2/other-tests.js
 RUNS  lib/example.spec.js
 PASS  tests2/other-tests.js
  bar
    ✓ always is true (17ms)

 PASS  lib/example.spec.js
  foo
    ✓ adds 5 (5ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.673s
Ran all test suites.

Watch Usage: Press w to show more.

إذا قمت بإزالة سجل وحدة التحكم ، فسيتم استبدال "RUNS" بشكل مرئي على النحو المنشود:

 PASS  lib/example.spec.js
  foo
    ✓ adds 5 (5ms)

 PASS  tests2/other-tests.js
  bar
    ✓ always is true (5ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.597s
Ran all test suites.

Watch Usage: Press w to show more.

إذا أضفت 3 سجلات لوحدة التحكم:

 PASS  lib/example.spec.js
  foo
    ✓ adds 5 (5ms)


 RUNS  tests2/other-tests.js

Test Suites: 1 passed, 1 of 2 total
Tests:       1 passed, 1 total
Snapshots:   0 total
  console.log tests2/other-tests.js:5
    JEST

 PASS  tests2/other-tests.jsests.js:6
  bar
    ✓ always is true (19ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 totalTime:        1.788sRan all test suites.

Watch Usage: Press w to show more.

إصدار العقدة:

30656 % node --version
v8.11.2

أعتقد أن spion يتعامل مع الأمر. لطيفة سهلة ريبرو.

يمكن تأكيد أن هذا يحدث في Node v8.11.1 LTS ويحدث فقط في الوضع watch و watchAll . بدون أوضاع الساعة ، لا بأس.

لدي نفس المشكلة مع Node v10.6.0 و Jest 23.4.1

نعم انا ايضا. اكتشفت للتو أن -w 1 يعيد التسجيل للعمل مرة أخرى ، وهو ما يتناسب مع فرضية spion .

عقدة 8.11.3
jest 23.4.0

أجد هذه المشكلة ، أو على الأقل مشكلة مماثلة ، عندما أقوم بتشغيل مطابقة التعبير العادي للملف (بالضغط على p في وضع watch ). مع تشغيل all ، تتم طباعة السجلات بالشكل المتوقع. ملاحظة --verbose غير موجود هنا.

نموذج 1

it.only(`should display a ErrorMessage component if state.validated is 'error'`, () => {
    const fV = shallow(<FormValidator/>);
    console.log('r1');
    console.error('r2');
    console.error('r3');
    ...

مع مشاهدة all (طباعة كلاً من log s و error s:

 PASS  src/components/__tests__/FormValidator.js
  ● Console

    console.log src/components/__tests__/FormValidator.js:56
      r1
    console.error src/components/__tests__/FormValidator.js:57
      r2
    console.error src/components/__tests__/FormValidator.js:58
      r3

في الوضع file regex (فقط طباعة أول log وليس error s):

Test Suites: 0 of 1 total
Tests:       0 total
Snapshots:   0 total
  console.log src/components/__tests__/FormValidator.js:56
    r1

 PASS  src/components/__tests__/FormValidator.jsidator.js:57
  FormValidator
    ○ skipped 3 tests
  FormValidator.displayMessage
    ✓ should display a ErrorMessage component if state.validated is 'error' (32ms)
    ○ skipped 5 tests
  FormValidator.render
    ○ skipped 1 test

نموذج 2

it.only(`should display a ErrorMessage component if state.validated is 'error'`, () => {
    const fV = shallow(<FormValidator/>);
    console.log('r1');
    console.error('r3');
    ...

all (طباعة كلاً من log و error كما هو متوقع):

 PASS  src/components/__tests__/FormValidator.js
  ● Console

    console.log src/components/__tests__/FormValidator.js:56
      r1
    console.error src/components/__tests__/FormValidator.js:59
      r3

watch (لم تتم طباعة أي شيء بالرمز أعلاه):

Snapshots:   0 total
 PASS  src/components/__tests__/FormValidator.jsator.js:56
  FormValidator
    ○ skipped 3 tests
  FormValidator.displayMessage
    ✓ should display a ErrorMessage component if state.validated is 'error' (20ms)
    ○ skipped 5 tests
  FormValidator.render
    ○ skipped 1 test

Test Suites: 1 passed, 1 total

نموذج 3

it.only(`should display a ErrorMessage component if state.validated is 'error'`, () => {
    const fV = shallow(<FormValidator/>);
    console.log('r1');
    console.log('r2');
    console.log('r3');
    console.log('r4');
    ...

all (طباعة كل الأربعة log s المتوقعة):

 PASS  src/components/__tests__/FormValidator.js
  ● Console

    console.log src/components/__tests__/FormValidator.js:56
      r1
    console.log src/components/__tests__/FormValidator.js:57
      r2
    console.log src/components/__tests__/FormValidator.js:58
      r3
    console.log src/components/__tests__/FormValidator.js:59
      r4

watch (تتم طباعة أول اثنين فقط log s مع الرمز أعلاه):

Snapshots:   0 total
  console.log src/components/__tests__/FormValidator.js:56
    r1

  console.log src/components/__tests__/FormValidator.js:57
    r2

 PASS  src/components/__tests__/FormValidator.jsator.js:58
  FormValidator
    ○ skipped 3 tests
  FormValidator.displayMessage
    ✓ should display a ErrorMessage component if state.validated is 'error' (31ms)
    ○ skipped 5 tests
  FormValidator.render
    ○ skipped 1 test

Test Suites: 1 passed, 1 total

لست متأكدًا مما فعلت ولكني أعتقد أن ترتيب كيفية إعداد الدعابة مهم. أعتقد أن بعض التكوينات قد تحل محل بعضها البعض. أحصل على كل من الاختبار وإخراج السجل.

node -v v8.11.2
jest -v 23.4.0

يوجد أدناه تكوين jest الخاص بي في package.json الخاص بي

""
"دعابة": {
"transformIgnorePatterns": [
"/ node_modules / "
] ،
"ملفات الإعداد": [
"/src/setupTests.js "
] ،
"testEnvironment": "jsdom"،
"مطول": صحيح ،
"المشاريع": [
{
"اسم العرض": " المكونات " ،
"ملفات الإعداد": [
"/src/setupTests.js "
] ،
"modulePaths": ["/ src / "]،
"testMatch": ["/ src / المكونات / __ الاختبارات __ / / .test.js "]} ،{"displayName": " REDUCERS"ملفات الإعداد": ["/src/setupTests.js "] ،"modulePaths": ["/ src / "]،"testMatch": ["/ src / المخفضات / __ الاختبارات __ / /.test.js "]
} ،
{
"displayName": " الإجراءات " ،
"ملفات الإعداد": [
"/src/setupTests.js "
] ،
"modulePaths": ["/ src / "]،
"testMatch": ["/ src / Actions / __ tests __ / * / .test.js "]
}
]
} ،

Here are my dependencies

"التبعيات": {
"بابل كور": "^ 6.26.3"،
"babel-jest": "^ 23.4.0"،
"babel-loader": "^ 7.1.5"،
"babel-preset-env": "^ 1.7.0"،
"babel-preset-response": "^ 6.24.1"،
"dotenv": "^ 6.0.0"،
"express": "^ 4.16.3"،
"jest": "^ 23.4.0"،
"رد فعل": "^ 16.4.1"،
"رد فعل دوم": "^ 16.4.1"،
"رد فعل - إعادة": "^ 5.0.7"،
"تفاعل البرامج النصية": "1.1.4"،
"redux": "^ 4.0.0"،
"وقت تشغيل المُعيد": "^ 0.12.0"
} ،

output from just running jest

مخفضات التمرير src / المخفضات / __ الاختبارات __ / التعليقات / index.test.js
✓ يتعامل مع الإجراءات من النوع SAVE_COMMENT (4 مللي ثانية)
✓ يعالج العمل بنوع غير معروف

PASS ACTIONS src / Actions / __ tests __ / index.test.js
حفظ التعليق
✓ لديه النوع الصحيح (1 مللي ثانية)
✓ لديه الحمولة الصحيحة (1 مللي ثانية)

مكونات المرور src / element / __ tests __ / App / index.test.js
✓ يجب إظهار قائمة التعليقات (5 مللي ثانية)
✓ يجب إظهار مربع التعليقات (1 مللي ثانية)

مكونات المرور src / element / __ tests __ / CommentBox / index.test.js
✓ به مساحة نصية (23 مللي ثانية)
✓ به زر (3 مللي ثانية)
منطقة النص
✓ يحتوي على منطقة نصية يمكن للمستخدمين الكتابة بها (9 مللي ثانية)
✓ عند إرسال النموذج ، يتم إفراغ منطقة النص (5 مللي ثانية)

مكونات المرور src / element / __ tests __ / CommentList / index.test.js
✓ ينشئ LI واحدًا لكل تعليق (32 مللي ثانية)

مجموعات الاختبار: 5 ناجح ، 5 في المجموع
الاختبارات: 11 مرت ، 11 المجموع
لقطات: 0 المجموع
الوقت: 3.79 ثانية
تم تشغيل جميع أجنحة الاختبار في 3 مشاريع.
console.log src / المكونات / __ الاختبارات __ / CommentList / index.test.js: 26
0

console.log src / المكونات / __ الاختبارات __ / CommentList / index.test.js: 27
اختبار

""

يجب إعادة فتح هذه المشكلة ، ابتلع إخراج وحدة التحكم من قبل المزاح أيضًا ، بيئتي هي:

→ عقدة - الإصدار
الإصدار 8.11.3

→ npx jest - الإصدار
23.4.1

حاولت بإعداد نظيف وكل شيء يعمل بشكل جيد.

// console.test.js
describe('jest should console output', () => {
  test('should console.log output be print', () => {
    console.log('console.log')
    expect(1).toBe(1)
  })

  test('should console.error output be print', () => {
    console.error('console.error')
    expect(1).toBe(1)
  })

  test('should console.info output be print', () => {
    console.info('console.info')
    expect(1).toBe(1)
  })
})

انتاج:

image

لذلك اعتقدت أن المشكلة قد تكون مرتبطة بتكوين الدعابة الخاص بي:

{
  "globals": {
    "API_SERVER_PLACEHOLDER": "SOME_API_ADDRESS"
  },
  "moduleFileExtensions": [
    "js",
    "jsx"
  ],
  "transform": {
    "^.+\\.jsx?$": "babel-jest"
  },
  "moduleNameMapper": {
    "\\.(css|less|sass|scss|png)$": "<rootDir>/__mocks__/styleMock.js",
    "\\.(gif|ttf|eot|svg|png)$": "<rootDir>/__mocks__/fileMock.js"
  }
}

أخبرني حدسي أن أتحقق من verbose وبعد إزالته كل شيء على ما يرام.

خلاصة

إصدار jest 23.4.1 بالتكوين verbose مضبوطًا على true قد يتسبب في ابتلاع إخراج وحدة التحكم.

اقترح تغيير تدفق الإخراج الافتراضي إلى stdout : https://github.com/noscripter/jest/pull/1

انها مكسورة مرة أخرى ؟! لماذا يستمر هذا في الانهيار؟

لقد عملت حول هذا مع:

expect(str).toBe("not this");

😬

إذا كان لديك verbose: true في package.json ، أو كنت تقوم بتشغيل الدعابة بالعلامة --verbose (أو كليهما؟) ، فحاول إزالتهما.

لا يهم أن هذا لم يعد مفيدًا.

يمكنني غالبًا رؤية إخراج السجل لجزء من الثانية _قبل_ طباعة ملخص الاختبار الكامل على وحدة التحكم. أنا مضطر إلى console.log حوالي 4-5 مرات متتالية لعرض الناتج ، وحتى ذلك الحين سيتم قطع آخر سجل في منتصف الطريق (على سبيل المثال عند طباعة كائن كبير ، فقط النصف الأول سوف تكون مرئية في آخر سجل مطبوع).

من الصعب جدًا أيضًا التنبؤ. في بعض الأحيان يكفي مبلغ أو اثنين console.log s ، بينما في أحيان أخرى يجب أن أضع ثلاثة إلى خمسة على التوالي. لا يهم أيضًا ما إذا كانت سجلاتي موجودة في الكود الذي أختبره ، أو في حالات الاختبار نفسها.

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

لقد قبلت في هذه المرحلة أنه يتعين علي نسخ السجلات ولصقها عدة مرات لرؤيتها في وحدة التحكم.

console.log يعمل إذا قمت بتشغيل ملف اختبار معين فقط

yarn test <your-test-file-name>

على سبيل المثال
yarn test FormValidator

لمعلوماتك ، أقوم بتشغيل repro الخاص بي باستخدام الأمر التالي:

script -qfc 'yarn repro' /dev/null > raw.log

Thats zsh - قد تريد script -qfce في bash

ثم شاهدت السجل بـ cat -vet raw.log . ها هي النتائج:

^[[2K^[[1G^[[1myarn run v1.7.0^[[22m^M$
^[[2K^[[1G^[[2m$ jest --watch^[[22m^M$
^[[2J^[[3J^[[H^[[1m^[[2mDetermining test suites to run...^[[1m^[[22m^[[999D^[[K^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^[[0m^[[7m^[[1m^[[32m PASS ^[[39m^[[22m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A  foo^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A    ^[[32mM-bM-^\M-^S^[[39m ^[[2madds 5 (4ms)^[[22m^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mlib/^[[22m^[[1mexample.spec.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m0 of 2 total^M$
^[[1mTests:       ^[[22m0 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        0s, estimated 1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^[[999D^[[K  ^[[2mconsole.log^[[22m ^[[2mtests2/other-tests.js:5^[[22m^M$
    JEST^M$
^M$
^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^[[0m^[[7m^[[1m^[[32m PASS ^[[39m^[[22m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A  bar^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A    ^[[32mM-bM-^\M-^S^[[39m ^[[2malways is true (15ms)^[[22m^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M$
^M$
^[[0m^[[7m^[[33m^[[1m RUNS ^[[22m^[[39m^[[27m^[[0m ^[[2mtests2/^[[22m^[[1mother-tests.js^[[22m^M$
^M$
^[[1mTest Suites: ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 of 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m1 passed^[[39m^[[22m, 1 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1s^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^M^[[K^M^[[1A^[[999D^[[K^[[1mTest Suites: ^[[22m^[[1m^[[32m2 passed^[[39m^[[22m, 2 total^M$
^[[1mTests:       ^[[22m^[[1m^[[32m2 passed^[[39m^[[22m, 2 total^M$
^[[1mSnapshots:   ^[[22m0 total^M$
^[[1mTime:^[[22m        1.128s^M$
^[[2mRan all test suites^[[22m^[[2m related to changed files^[[22m^[[2m.^[[22m^M$
^M$
^[[1mWatch Usage^[[22m^M$
^[[2m M-bM-^@M-: Press ^[[22ma^[[2m to run all tests.^[[22m^M$
^[[2m M-bM-^@M-: Press ^[[22mf^[[2m to run only failed tests.^[[22m^M$
^[[2m M-bM-^@M-: Press^[[22m p ^[[2mto filter by a filename regex pattern.^[[22m^M$
^[[2m M-bM-^@M-: Press^[[22m t ^[[2mto filter by a test name regex pattern.^[[22m^M$
^[[2m M-bM-^@M-: Press^[[22m q ^[[2mto quit watch mode.^[[22m^M$
^[[2m M-bM-^@M-: Press ^[[22mEnter^[[2m to trigger a test run.^[[22m^M$

أتمنى أن يساعدك هذا. يبدو أن هناك عددًا خاطئًا من رموز التحكم في نقطة معينة.

تبدو النتيجة النهائية كما يلي:

 PASS  lib/example.spec.js
  foo
    ✓ adds 5 (4ms)


 RUNS  tests2/other-tests.js

 PASS  tests2/other-tests.js2 total
  bar
    ✓ always is true (15ms)

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.128s
Ran all test suites related to changed files.

Watch Usage
 › Press a to run all tests.
 › Press f to run only failed tests.
 › Press p to filter by a filename regex pattern.
 › Press t to filter by a test name regex pattern.
 › Press q to quit watch mode.
 › Press Enter to trigger a test run.

سطر وحدة التحكم مفقود ، وتم كتابة سطرين بعيدًا جدًا لأسفل ، على الأرجح بسبب التشابك مع console.log الذي لم يؤخذ في الاعتبار عند الصعود لعرض "PASS"

تحرير: تمت إضافة هذا الملخص في جوهر لتسهيل البحث والتلاعب: https://gist.github.com/spion/bbb34c5abc1230a37ad5f4f01336b8df

ملاحظة لإعادة إنتاج هذا مع السيد الحالي قد يحتاج إلى بعض الإكراه. عند الدخول إلى وضع الساعة ، اضغط مع الاستمرار على "a" لفترة من الوقت - ستبدأ console.logs بالخروج عن السيطرة في مرحلة ما (تظهر في أماكن وأوقات غير متوقعة)

لقد نسيت أيضًا - أنا على ubuntu bionic ، إذا كان ذلك يحدث أي فرق في سلوك WRT الطرفي:

% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

أنا أيضا. spion قد سمّر ما أراه. لقد اكتشفته فقط لأن لدي اختبارات على كود بطيء وغير متزامن. أرى إخراج وحدة التحكم ، ثم يتم استبداله بملخص نتائج الاختبار.

لما يستحق ، لقد عدت إلى [email protected] وعمل ذلك على حل المشكلات التي كنت أواجهها مع إخراج ملخص الاختبار الذي يتم كتابته عبر إخراج وحدة التحكم في [email protected] .

تحديث - أعتقد أنني وجدت تصحيحًا بسيطًا يحقق بعض التقدم ، لكن الأمر استغرق مني بعض الوقت لفهم التفاعل بين مراسلي Jest ومنشئ الحالة

تقوم Jest monkey-patches بعمليات الكتابة stderr و stdout التي تدفقات مع كاتبها. يكتب هذا الكاتب ناتج jest-cli Status.js ، الذي يحتوي على أشياء مثل عدد الاختبارات قيد التقدم وشريط التقدم والوقت المنقضي وما إلى ذلك.

عندما يكون هناك تعليمات كتابة في هذا الدفق ، يتم استبدال هذه التعليمات بتعليمات "حذف" للحالة (الصعود باستخدام رموز التحكم ANSI) ، والكتابة الأصلية ، وتعليمات "كتابة الحالة مرة أخرى". وبالتالي الوهم بأن الحالة تكون دائمًا في أسفل الشاشة ، بينما يتم تمرير النص فوقها.

(بالطبع ، إنه أذكى قليلاً من ذلك - يتم تخزين عمليات الكتابة مؤقتًا ويتم كتابة البيانات المخزنة مرة واحدة فقط كل 100 مللي ثانية مع الحالة)

ومع ذلك ، فإن عداء الاختبار المتوازي (المستخدم في وضع المراقبة ، والذي يعين runInBand إلى false) يدير عمالًا آخرين. تم إعداد هؤلاء العمال لـ "وراثة" تيار stdio للعملية الأصلية. لسوء الحظ ، هذا لا يعني أنهم يرثون الإصدار المصحح الذي يقوم بتحديث الحالة! إذا حدثت هذه الكتابات ، فستكون كذلك

  1. تمت إضافته بعد الحالة (لا يتم مسح الحالة)
  2. سيتم مسحه في حالة محو الحالة التالية (مما يجعل الحالة السابقة مرئية جزئيًا أيضًا ، نظرًا لأن المحو لا يتحرك لأعلى بشكل كافٍ لمسح كل من إخراج وحدة التحكم وتحديث الحالة القديمة)

للتأكد من أن النسخة المصححة تتلقى تلك الكتابة tty ، من الضروري تبديل تدفقات العمليات الفرعية من وضع "وراثة" إلى وضع "توجيه". بهذه الطريقة تكون مخرجات العملية متاحة كتدفقات في العملية الفرعية بدلاً من الذهاب مباشرة إلى stdout / stderr الرئيسي. نحتاج أيضًا إلى توجيه التدفقات يدويًا:

diff --git a/packages/jest-runner/src/index.js b/packages/jest-runner/src/index.js
index 2f4dd724..618a8cbf 100644
--- a/packages/jest-runner/src/index.js
+++ b/packages/jest-runner/src/index.js
@@ -97,11 +97,14 @@ class TestRunner {
     // $FlowFixMe: class object is augmented with worker when instantiating.
     const worker: WorkerInterface = new Worker(TEST_WORKER_PATH, {
       exposedMethods: ['worker'],
-      forkOptions: {stdio: 'inherit'},
+      forkOptions: {stdio: 'pipe'},
       maxRetries: 3,
       numWorkers: this._globalConfig.maxWorkers,
     });

+    worker.getStdout().pipe(process.stdout);
+    worker.getStderr().pipe(process.stderr);
+
     const mutex = throat(this._globalConfig.maxWorkers);

     // Send test suites to workers continuously instead of all at once to track

يضمن توجيه التدفقات يدويًا أن الكتابة التي تم تصحيحها على شكل قرد يتم استدعاؤها بواسطة العقدة.

يكسر هذا الكثير من اختبارات التكامل ، ومع ذلك يتم كسرها بشكل أساسي بسبب اللون المفقود. عمل

diff --git a/packages/jest-worker/src/worker.js b/packages/jest-worker/src/worker.js
index 5eee64af..5e5126eb 100644
--- a/packages/jest-worker/src/worker.js
+++ b/packages/jest-worker/src/worker.js
@@ -94,6 +94,8 @@ export default class {
         {
           cwd: process.cwd(),
           env: Object.assign({}, process.env, {
+            // $FlowFixMe: Does not know about isTTY
+            FORCE_COLOR: process.stdout.isTTY,
             JEST_WORKER_ID: this._options.workerId,
           }),
           // Suppress --debug / --inspect flags while preserving others (like --harmony).

ينزل هذا الرقم بشكل كبير ولكنه لا يزال مرتفعًا جدًا:

Test Suites: 51 failed, 232 passed, 283 total
Tests:       149 failed, 7 skipped, 2706 passed, 2862 total
Snapshots:   19 failed, 17 obsolete, 996 passed, 1015 total

لا أعتقد أن هناك طريقة للتغلب على هذا - تم تغيير الإخراج بشكل كبير ، حيث ينتهي الأمر بالكثير من الكتابات بإضافة تحديث الحالة الآن.

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

الرجاء الإصلاح ، هذا يضر الإنتاجية حقًا مع الدعابة

يؤدي الرجوع إلى إصدار [email protected] إلى إعادة إخراج سجل وحدة التحكم. اضطررت إلى تعيين عقدة --env لجعلها تعمل بالرغم من ذلك. الرجاء إصلاح هذا.

في الوقت الحالي ، يبدو أن الطريقة الوحيدة التي يمكنني من خلالها الحصول على إمكانية الاعتماد على تسجيل وحدة التحكم هي تسجيل نفس الشيء 3-4 مرات على التوالي. سوف Jest فقط حظر عدد معين منهم. لا يزال مزعج جدا.

هل هناك أي تحديث على ذلك؟ أقوم بتشغيل jest 23.4.1 و node 9.11.1 وأحيانًا أحصل على إخراج سجل وحدة التحكم وأحيانًا لا.

سنتان من عدم وجود سجلات وحدة التحكم جعلتني مطورًا أفضل. شكرا فريق Jest!

لا أصدق أن هذا لا يزال يمثل مشكلة. لماذا تم إغلاق القضية؟

أعني ، من يريد تصحيح أخطاء اختباراته الفاشلة ، أليس كذلك؟

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

FWIW ، يعمل --verbose = الحل البديل الخاطئ بالنسبة لي. في package.json :

"scripts": {
...
    "test": "react-scripts test --env=jsdom --verbose=false",

بعض الملاحظات الأخرى:

  • أدت إزالة --env = jsdom (ليس خيارًا لتطبيقي الحقيقي) إلى جعله يعمل بدون --verbose = false.
  • كما أن إجراء الاختبار مباشرة باستخدام الدعابة (وليس من خلال البرامج النصية للردود) جعله يعمل أيضًا.
  • عندما يفشل التأكيد وتحصل على قدر أكبر بكثير من المخرجات من الدعابة ، يتم أيضًا الكتابة فوق المزيد من سجلات وحدة التحكم الخاصة بك.

مرحبا شباب / بنات ،
لقد قابلت أيضًا مشكلة سجل وحدة تحكم jest الشهيرة عند تشغيل الاختبار في وضع الساعة.
كان الحل هو استخدام --watchAll بدلاً من --watch. أصبح ملخص الاختبارات قبيحًا ، لكن السجلات أظهرت كما هو متوقع.

ماك أو إس هاي سييرا
عقدة v8.11.3
دعابة: 23.6.0
ts-jest: 23.10.4

بالنسبة لي هذا في beforeAll

  console.log = s => {
    process.stdout.write(s + "\n");
  };

وهذا في القشرة قام بالعمل:

yarn test > test.log

بالنسبة لي ، أدى التبديل إلى mocha إلى حل المشكلة. يعد التبديل أمرًا بسيطًا للغاية ، نظرًا لأن DSL متشابه جدًا. يمكنك حتى الاستمرار في استخدام مكتبة JEST المتوقعة: https://www.npmjs.com/package/expect

يكاد يكون الأمر سهلاً مثل إزالة jest وتثبيت mocha .

تحرير: البريد العشوائي أم لا ، إنه أسهل حل متاح هنا.

هذه المشكلة مؤلمة حقًا ، أتمنى أن يتمكن المشرفون من إصلاح هذا في أسرع وقت ممكن ، لأن Jest تهدف إلى زيادة الإنتاجية ، وليس العكس ، أليس كذلك؟

على أي حال ، ما يلي هو ما أستخدمه اكتب الآن:

export const log = (s: any) => {
    console.log(s);
    console.log(s);
    console.log(s);
    process.stdout.write(s + "\n");
};

يجب عليك البريد العشوائي طريقك للخروج.

تم التأكيد على أن --verbose=false يصلح المشكلة.

لا يعمل --verbose=false مع الإصدار 23.6.0

OMG هذا هو الألم: / نوفمبر 2018

يرجى إعادة فتح هذه المشكلة

حاول تعيين silent: false في jest.config.js ... في حالتي ، فقد ساعدني ذلك

لا يعمل أي من الحلول.
NodeJS: v8.12.0
دعابة: v23.4.1

لقد كنت أستخدم Jest لأشهر وهو أمر رائع ، وعلى الرغم من أن هذا الخطأ _ مزعج للغاية_ ، فإن الحل البديل الذي استخدمته دائمًا هو تقديم تأكيد غير مرغوب فيه حيث سيؤدي ذلك إلى تسجيل الدخول إلى وحدة التحكم في كل مرة.

على سبيل المثال ، عند محاولة تسجيل الخروج من مكالمة وهمية:

يطبع expect('hello').toEqual(childFunc.mock.calls[0]) :

screen shot 2018-11-27 at 10 26 44 am

إنه ليس مثاليًا ولكنه ينجز المهمة ويسمح لي بإنهاء كتابة اختباراتي.

تشغيل الدعابة بعلم الساعة.
نسخة Jest 23.5.0
إصدار العقدة 8.11.3

هذا مثال لائق على "الكثير من السحر" الذي يحدث تحت الغطاء ، وعواقب ذلك عندما يحدث خطأ ما. لست مقتنعًا بأن تجميع إخراج console.log يستحق عام ونصف من عبارات console.log المفقودة. 😕

اتفق مع ما ورد أعلاه - هذا ليس أمرًا رائعًا تمامًا ، لكنه يجعل Jest مؤلمًا بطريقة غير ضرورية تمامًا.

"الحل البديل" الخاص بي هو أن الكثير من المنطق يستخدم log4js ، لذا فأنا على ما يرام عندما أقوم بضم Jest إلى رمز من جانب الخادم. للأسف لدي قدر كبير من التعليمات البرمجية الخاصة بالعميل حيث عادةً ما أقوم بنسخ ولصق أربع نسخ من كل console.log حيث يبدو أن إحداها تظهر في النهاية.

يعد استخدام expect لتسجيل المعلومات حلاً مناسبًا إذا كنت تقوم بالتسجيل من داخل اختبار (خاصة أنه يمكنك إنشاء مقتطف له باستخدام كلمة رئيسية مثل logjest في المحرر الخاص بك) ، ولكن هذا تقصر كلما احتجت إلى التعمق والتسجيل من داخل الوظائف الفعلية التي تستدعيها اختباراتك.

ماذا عن CI=true yarn run test ؟

آسف لما قلته من قبل ، لكنه يعمل بشكل جيد بدون عنوان حالات الاختبار ، أعني ، بدون خيار "- overbose" ، أعتقد أن - overbose يقوم بنوع من التنسيق ويستبدل تيار stdout.
لذلك ، بالنسبة لي ، فقد كنت لمدة شهرين وكل شيء يسير على ما يرام.
وإذا أراد أي شخص استخدام هذا الخيار ، فقم بإلحاقه فقط بأوامر npm الخاصة بك مثل: npm run test: Integration - --watchAll --verbose --coverage --etc

هل يمكن للأشخاص ذوي المشكلة اختبار [email protected] ؟ يتضمن # 6871

@ jamesta696 مرحبًا ، أعتقد أنك بحاجة إلى نشر هذا النوع من الأسئلة على StackOverflow باستخدام علامة "jest" هنا لأن المناقشات هنا تخص "المشكلات" ، ومع ذلك ، أعلم أن شخصًا ما يمكن أن يساعدك ، ولكن المشكلة هنا يمكن يتم إغلاقها لأن القضية الرئيسية لم تتم مناقشتها.
وفي الوقت الحالي ، لا يمكنني تقديم إجابة عن هذا السؤال لأنني لا أطور شيئًا للرد والواجهة الأمامية ، أيضًا ، أنا لست عضوًا في الدعابة ، لكن دعنا نحاول اتباع القواعد.

SimenB لقد قمت بتحديث الدعابة (إلى نسختك المذكورة) وحاولت وضع بعض كشوفات حساب console.log في مشروعي الذي كان به المشكلة. حتى الآن ، يبدو أنه تم إصلاحه: تظهر جميع console.log s. سأستمر في استخدامه وأعلمك إذا واجهت المشكلة مرة أخرى.

لمعلوماتك: كنت (وما زلت) أستخدم jest --watchAll

tobyhinloopen Cool لمشاهدة دليل على التقدم الذي ذكر SimenB .

هذا رائعtobyhinloopen!

يمكنني أيضًا أن أؤكد أن [email protected] يعمل بشكل جيد ويمكنك رؤية جميع سجلات وحدة التحكم بدون --verbose = false.

يمكنني أيضًا أن أؤكد أن [email protected] يعمل بشكل جيد ويمكنك رؤية جميع سجلات وحدة التحكم بدون --verbose = false.

+1. يمكن أن تؤكد أيضا. سعيد لرؤية هذا يعمل. عمل جيد ، يا رفاق! 😄

أستطيع أن أؤكد كذلك! إنه مثل عيد الميلاد. 🎅

😃

فقط لا تحتاج إلى الانتظار حتى تحديثات إنشاء التطبيق التفاعلي

أنا أستخدم إصدار الدعابة 24.0.0 ، ومع ذلك ما زلت لا أرى console.log أو console.error . أتساءل ما قد أفعله خطأ.

تأكد من عدم السخرية منهم

هذا غريب حقا. يبدو أن هناك مشكلة في المعالجة غير المتزامنة. لا يمكنني الحصول على الأخطاء ليتم عرضها. حتى لو تم الالتفاف إلى كتل try/catch ، لا يمكنني رؤية الخطأ.

المعلمة generator صحيحة بالتأكيد ، إذا قمت بإزالة استدعاء الدالة غير المتزامن ، فسيتم تسجيلها بشكل صحيح. تقوم أيضًا بإرجاع السلسلة الصحيحة عندما تكون خارج حلقة for.

image

إصدار Jest هو 24.0.0 ، العقدة هي 10.5

tiborsaas من المحتمل أن يكون اختبارك قد انتهى قبل تشغيل console.log .
إذا كنت تريد انتظار التكرار الذي يزيد عن changedGenerators ، فستحتاج إلى شيء مثل

await Promise.all(changedGenerators.map(async (generator) => {/* ... */}))

شكرًا على الرد ، ولكن الأمر ليس كذلك حقًا ، فبعض الأخطاء تمنع عرض console.log . هناك وظيفة أخرى غير متزامنة تعمل بشكل جيد مع console.log إذا سميتها في رد الاتصال forEach .

تحرير: في الواقع عن طريق تصحيح الأخطاء سطرًا بسطر وأنا أعلم أن المشكلة تكمن في

const archives = await fs.readdir(archiveDir);

لكن هذه القضية الدعابة تتعلق بتسجيل الأشياء. لا أريد أن أخرج المحادثة عن مسارها.

ربما لا تزال تواجه خطأ ما ، أردت فقط الإشارة (دون معرفة الكود الدقيق) إلى أنه من الجيد عمومًا التخلي عن مجموعة من الوعود من هذا القبيل دون انتظارها ، لأنهم قد يرفضون بعد انتهاء الاختبار: )

أوافق ، لكني أريد تشغيل مكالمات expect في forEach لأنني لا أعرف مسبقًا عدد التغييرات التي يجب أن أتعامل معها.

لسوء الحظ ، لم يصلح أسلوب Promise.all أي شيء.

هل استخدمت map بدلاً من forEach ؟ الهدف هو إعادة مجموعة من الوعود إلى Promise.all

SimenB نعم ، أعرف.

image

إذا كان هناك خطأ ، لا يمكنني رؤيته.

tiborsaas أنت لا تنتظر Promise.all حتى تكتمل: استخدم await Promise.all(...)

فعلت ذلك أيضا ، نفس النتيجة. :(

ماذا لو أضفت await new Promise((resolve) => setTimeout(resolve, 1000)) أقل promise.all ؟

هل يمكنك فتح قضية جديدة مع الاستنساخ؟ أعتقد أن المشكلة التي أبلغ عنها OP قد تم إصلاحها أثناء رؤيتك لمشكلة مختلفة (بغض النظر عما إذا كنت تتعامل مع عدم المزامنة بشكل صحيح أم لا ، فلا يزال يتعين عليك رؤية بيان السجل)

نعم ، إنه أمر غريب حقًا ، شيء من هذا القبيل

test('stuff', () => {
    setTimeout(() => console.log('hi', 500));
})

عادة ما تزال تتم طباعتها بطريقة ما

إنه يستخدم دالة رد الاتصال كوسيطة ثانية لـ Promise.all([...], callback) . يجب أن يستخدم Promise.all([...]).then(callback) . ربما يحل ذلك مشكلته ، أعتقد أن الوسيطة الثانية من .all تم تجاهلها ولم يتم تنفيذها أبدًا (لذلك لن يتم تنفيذ سجلاتك أبدًا). تضمين التغريدة

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

نعم ، هذا خطأ ، ولكن يجب أن تظهر بيانات السجل

SimenB كلا ، تم تجاهل الوسيطة الثانية.

> Promise.all([Promise.resolve(true)], () => console.log("hi")).then(console.log, console.error);
Promise {
  <pending>,
  domain: 
   Domain {
     domain: null,
     _events: { error: [Function: debugDomainError] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }
// output:
// [ true ]



نعم ، لقد تم الخلط بينه وبين ذلك ، آسف. تضمين التغريدة

عمل const lol = await Promise.all(versions); كما هو متوقع.

في هذه الحالة ، قد يتم فقد بيانات السجل نظرًا لعدم استدعاء الوظيفة مطلقًا ، ولكن لا يزال يتعين عليك رؤية بيانات السجل في الحالة الأصلية forEach حيث ستنتظر العقدة حتى تكتمل الوعود قبل إنهاء العملية. لذلك لا يزال هذا خطأ ، على الرغم من أنه خطأ مستخدم

PR: # 7731

أستخدم https://www.npmjs.com/package/debug للقيام بالتسجيل. هل سيعمل ذلك مع Jest؟

لا ، ليس حتى نفعل # 6524.

أوصي بالسخرية debug في اختباراتك واستخدام console.log إذا كنت تريدها

كمرجع ، يمكن أن تضيع رسائل وحدة التحكم إذا تمت طباعتها بعد اكتمال الاختبارات ، انظر التعليقات في أسفل # 7731. قد يكون هذا هو السبب وراء بعض ، ولكن ربما ليس كل رسائل وحدة التحكم المفقودة المبلغ عنها هنا.

- عمل الإفراط في الكلام بالنسبة لي. قبل استخدام - overbose ، تم فقد بعض الرسائل وليس جميعها. أنا أستخدم العقدة v10.15.3 و jest v21.2.1

لا تزال مشكلة بالنسبة لي ، سجلات وحدة التحكم لا تظهر في Jest

على الرغم من الإعلان الأخير في المدونة عن حل المشكلة نهائيًا ، إلا أن المشكلة لا تزال قائمة ، ولا تظهر سجلات وحدة التحكم الخاصة بي في بعض الأحيان مرة أخرى ، فأنا أستخدم jest v24.8.0 .

وأعمالي على ما يرام 🤷‍♂️. يرجى نشر نسخة يمكننا التحقيق فيها. نحن لسنا معالجات ، لا يمكننا رؤية شفرتك التي فشلت في تسجيل الإخراج.

في الواقع ، بعد التحقيق ، السجلات المتعلقة باختبار API (مثل supertest) لا تعمل. متوقع :/

thymikee يحدث هذا بشكل غير متسق لذا من الصعب حقًا إعادة إنتاجه. مثال:
عمليات التشغيل التالية عن طريق تحديد ملف واحد من الاختبارات (الخيار ع)

  • console.log ('pantz') (يعمل)
  • تغيير console.log (myObject) (لا يعمل)
  • قم بتغييره ليلائم (لا يعمل)
  • التغيير إلى console.log ('pantz') (لا يعمل)
  • التغيير المناسب لها (لا يعمل)
  • إعادة تشغيل الدعابة (لا تعمل)
  • تغييره ليناسب (العمل)

الآن حاولت تكرار نفس الخطوات وكانت النتيجة غير متسقة.

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

هناك الكثير من احتمالات أخطاء المستخدم أيضًا ، وغالبًا ما ينقصها await أو خلاف ذلك غير متزامن console.log 's.

سأحاول إيجاد وقت لإعادة إنتاج هذا بعد ذلك. حتى ذلك الحين وجدت سجلاتي تؤكل بالنتائج كما ترون من الأسفل. قبل ظهور FAIL ، يمكنك رؤية سجلي 2 هناك. ومن الجدير بالذكر أيضًا أنه تمت إزالة سجلين فقط. إذا أضفت 10 سجلات تحت بعضها البعض ، فسيتم عرض 8. أعتقد أن هذه بداية جيدة :)

ezgif com-gif-maker

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

باستخدام winston ، يمكنك تكوين ما تريد تسجيله في المكان الذي يدعم فيه عمليات النقل المتعددة وعمليات النقل التي يمكنك تنفيذها بنفسك.

const logger = winston.createLogger({
  level: "verbose",
  format: winston.format.json(),
  defaultMeta: {},
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: "combined.log" }),
  ],
});

logger.error(stuff)

ربما يمكنك فعل شيء قذر مثل تجاوز console.* عالميًا لمسجل وينستون.

@ kresli ما هو الإصدار الخاص بك هو الدعابة؟ يبدو أن سلوك الإصدار 23

هذا يحدث لي باستمرار مع jest v^24.6.0 و node v10.14.2 . اي فكرة لماذا؟

yaelz هذه مشكلة stubbern تحدث عادةً بسبب خطأ المستخدم ولكن لها أيضًا تاريخ من الأخطاء التي يصعب إعادة إنتاجها.

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

شكرا على الاستجابة السريعة!
سيكون ذلك صعبًا لأن الريبو الحالي خاص في مؤسستي ... سأخبرك إذا وصلت إليه :)

هذا يحدث لي باستمرار مع jest v^24.6.0 و node v10.14.2 . اي فكرة لماذا؟

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

هل يمكنك مشاركة الإصدارات التي تستخدمها الآن عندما يتم حلها؟

يوم الإثنين 5 أغسطس 2019 الساعة 12:43 مساءً Norman Enmanuel [email protected]
كتب:

شكرا على الاستجابة السريعة!
سيكون ذلك صعبًا لأن الريبو الحالي خاص في مؤسستي ...
أنت تعرف إذا وصلت إليها :)

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

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/jest/issues/3853؟
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AB6F4PFXDSRHBW5CMTT2DKDQC7Y2DANCNFSM4DPZ3JSA
.

هل يمكنك مشاركة الإصدارات التي تستخدمها الآن عندما يتم حلها؟

بالتأكيد:

دعابة

^24.8.0

عقدة الخامس

v10.16.0

وهذه بعض نصوص npm التي أستخدمها لتشغيل كل من e2e والتكامل والوحدة والقبول:

"scripts": {
  "test": "NODE_ENV=test npm run test:unit && npm run test:integration:both",
  "test:unit": "NODE_ENV=test jest --config test/jest.config.unit.js --detectOpenHandles",
  "test:integration": "NODE_ENV=test MOCK=false jest --config test/jest.config.integration.js --runInBand --detectOpenHandles",
  "test:integration:mock": "NODE_ENV=test MOCK=true jest --config test/jest.config.integration.js --runInBand --detectOpenHandles",
  "test:integration:both": "NODE_ENV=test npm run test:integration:mock -- --coverage; npm run db:migration:test; npm run test:integration -- --coverage;",
  "test:report": "open docs/test/report/index.html",
  "test:report:coverage": "open docs/test/coverage/lcov-report/index.html"
}

هذا هو jest.config:

"use strict";

module.exports = {
  "bail": true,
  "verbose": false,
  "collectCoverage": false,
  "expand": true,
  "testURL": "http://localhost:3000/",
  "coverageDirectory": "./docs/test/coverage",
  "testEnvironment": "node",
  "rootDir": "../",
  "setupFilesAfterEnv": [
    "./test/jest.setup.js"
  ],
  "jest.showCoverageOnLoad": true,
  "watchPathIgnorePatterns": ["node_modules"],
  "transform": {
    "^.+\\.js$": "babel-jest",
    '^.+\\.tsx?$': 'ts-jest',
  },
  "reporters": [
    "default",
    ["./node_modules/jest-html-reporter", {
      "pageTitle": "...",
      "outputPath": "./docs/test/report/index.html",
      "includeFailureMsg": true,
      "sort": "titleAsc",
      "dateFormat": "yyyy-mm-dd HH:MM:ss"
    }]
  ]
};

آمل أن يساعد.

سأحاول إيجاد وقت لإعادة إنتاج هذا بعد ذلك. حتى ذلك الحين وجدت سجلاتي تؤكل بالنتائج كما ترون من الأسفل. قبل ظهور FAIL ، يمكنك رؤية سجلي 2 هناك. ومن الجدير بالذكر أيضًا أنه تمت إزالة سجلين فقط. إذا أضفت 10 سجلات تحت بعضها البعض ، فسيتم عرض 8. أعتقد أن هذه بداية جيدة :)

ezgif com-gif-maker

kresli ما هو شريط الحالة وإخراج الوقت الموجود لديك هنا؟ عندما أقوم بتشغيل مجموعة الاختبار الخاصة بي ، أرى _RUN HARNESS test-harness / index.js_ ولا شيء آخر حتى يعمل كل شيء. ثم أرى رسالة console.log الخاصة بي في النهاية والسطر الذي يحتوي على _RUN HARNESS ..._ يتغير إلى _ظفيرة...._

تحديث: من فضلك تجاهل ، تبين أنها مشكلة في الكود الخاص بي

لا تزال تواجه هذا مع العقدة v12.16.1 ، jest 25.5.4 ، مطبوعة 3.8.3 على MacOS. جربت توصيات استخدام --runInBand ، تعطيل / تمكين مطول ، باستخدام --silent = true ، لم يساعد ذلك.

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