Jest: يتم إعطاء الأولوية للوحدات الوهمية على node_modules

تم إنشاؤها على ١٣ أكتوبر ٢٠١٦  ·  3تعليقات  ·  مصدر: facebook/jest

هل ترغب في طلب _ ميزة _ أو الإبلاغ عن _ خطأ _؟
الإبلاغ عن خطأ.

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

إذا كان السلوك الحالي عبارة عن خطأ ، فالرجاء تقديم خطوات إعادة الإنتاج وإذا أمكن الحد الأدنى من المستودع على GitHub بحيث يمكننا npm install و npm test .

  1. استنساخ https://github.com/ticky/jest-mock-bug ، npm install التبعيات
  2. قم بتشغيل npm test

فشل الاختبار الذي يتوقع أن تكون قادرًا على استيراد الوحدة العامة ( with no explicit opt-out › globalPad should not be a mock function ) لأن الوحدة التي تم إرجاعها هي في الواقع محاكاة يدوية.

(لاحظ أنه يتم استخدام left-pad هنا لأنه وحدة صغيرة بدون متطلبات تجميع.)

ما هو السلوك المتوقع؟

يجب أن يُرجع بيان الاستيراد الوحدة النمطية العامة ، كما هو الحال في explicit-opt-out.js

قم بتشغيل Jest مرة أخرى بـ --debug وقدم التكوين الكامل الذي تطبعه.

jest version = 16.0.1
test framework = jasmine2
config = {
  "rootDir": "/Users/jessica/Repositories/jest-mock-bug",
  "name": "-Users-jessica-Repositories-jest-mock-bug",
  "setupFiles": [],
  "testRunner": "/Users/jessica/Repositories/jest-mock-bug/node_modules/jest-jasmine2/build/index.js",
  "scriptPreprocessor": "/Users/jessica/Repositories/jest-mock-bug/node_modules/babel-jest/build/index.js",
  "usesBabelJest": true,
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/rl/98bml8qx57n3b6xgsgyvbxtr0000gn/T/jest",
  "clearMocks": false,
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "moduleDirectories": [
    "node_modules"
  ],
  "moduleFileExtensions": [
    "js",
    "json",
    "jsx",
    "node"
  ],
  "moduleNameMapper": {},
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "preprocessorIgnorePatterns": [
    "/node_modules/"
  ],
  "resetModules": false,
  "testEnvironment": "jest-environment-jsdom",
  "testPathDirs": [
    "/Users/jessica/Repositories/jest-mock-bug"
  ],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.jsx?$",
  "testURL": "about:blank",
  "timers": "real",
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "cache": true,
  "watchman": true,
  "testcheckOptions": {
    "times": 100,
    "maxSize": 200
  }
}

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

نعم ، النماذج اليدوية لها الأسبقية على وحدات العقد. نظام mocks اليدوي سطحي بعض الشيء. في الوقت الحالي ، نقوم بإزالة التحذير في الإصدار التالي ، لذلك يجب أن يكون jest.unmock('left-pad') هو كل ما تحتاجه. انظر # 2022

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

ال 3 كومينتر

أعتقد أن هذه الحالة مشابهة لما حدث في مشروعي

في حالتي لدي <rootDir>/__mocks__/left-pad.js . ستعمل جميع الاختبارات التي تستورد left-pad تلقائيًا على استيراد left-pad المثير للسخرية على الرغم من أنني لم أتصل صراحةً بـ jest.mock('left-pad')

الحل الحالي الخاص بي هو محاكاة صريحة ومن ثم إلغاء السخرية منهم بشكل صريح. إنه قبيح ، لكنه يعمل

jest.mock('left-pad');
jest.unmock('left-pad');

اها شكرا! هذا حل أنظف من حلّي ، رغم أنه بالتأكيد ليس مثاليًا!

نعم ، النماذج اليدوية لها الأسبقية على وحدات العقد. نظام mocks اليدوي سطحي بعض الشيء. في الوقت الحالي ، نقوم بإزالة التحذير في الإصدار التالي ، لذلك يجب أن يكون jest.unmock('left-pad') هو كل ما تحتاجه. انظر # 2022

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

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