Jest: قبل الجميع

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

هل هناك اي طريق للعالمية قبل الكل؟

يمكنني تحديد beforeAll في كل ملف اختبار ولكن هذا سيؤدي إلى تشغيل beforeAll مرة واحدة لكل ملف اختبار.

هل هناك أي عالمي قبل كل ما سيتم تشغيله مرة واحدة وينتهي قبل بدء الاختبار الأول؟

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

+1 للإعداد العالمي. مثل المستخدمين الآخرين ، أود إعداد التطبيق / قاعدة البيانات وتفكيكها مرة واحدة فقط.

ال 36 كومينتر

هل رأيت ملفات الإعداد ؟

كمرجع يستخدم مشروعي setupFiles مثل هذا:

package.json

{
  "jest": {
    "setupFiles": [
      "./private/mocks/runtime.js"
    ]
  }
}

./private/mocks/runtime.js

global.__meteor_runtime_config__ = {ROOT_URL: 'localhost'};

قد يكون FYI Stack Overflow مكانًا أفضل لهذا النوع من الأسئلة. (سؤال حول الاستخدام بدلاً من تقرير خطأ / طلب ميزة).

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

أنا أستخدم تطبيق create-react-app.
وتشغيل ملفات setupFiles مرة أخرى لكل ملف اختبار.

إعطاء إجابة غير صحيحة وإغلاق القضية بعد ذلك. أحسنت!

cpojerashtonsix لا أعتقد أنه يجب إغلاق هذا والإجابة غير صحيحة ، يتم تشغيل كل من setupFiles أو setupTestFrameworkScriptFile لكل مجموعة اختبار ، لذلك لم يكن هناك "عام" من قبل حيث يمكننا تعيين أفكار مثل تنظيف اختبار ديسيبل قبل إجراء الاختبار

هل يمكن أن يكون لديك pretest في package.json؟

@ Negan1911 - ربما ، ولكن من الصعب معرفة ما هو المقصود في OP. يمكنك التفكير في إنشاء مشكلة ثانية إذا كنت تعتقد أنها ميزة مفيدة وتريد إضفاء مزيد من الوضوح على طلب الميزة هذا؟

cpojerashtonsix إذا فهمت ذلك بشكل صحيح ، فلا يمكن حاليًا الحصول على إعداد شامل وتفكيك كما تمت مناقشته هنا في Mocha .
حالة الاستخدام التي أمتلكها (وربما OP) هي أنني أريد تشغيل خادم وبعد ذلك فقط جميع اختبارات التكامل الخاصة بي (وربما بعد تشغيلهم جميعًا ، قم بإفلات اختبار DB).
هل لديك أي نصيحة أو أفضل الممارسات للقيام بذلك؟
ما وجدته هو أن معظم الأشخاص يخبرونهم ببدء تشغيل خادم وإغلاقه لكل مجموعة اختبار في "محلي" قبل الكل / بعد الكل ، على سبيل المثال هنا من خلال @ kentcdodds ، ولكن ينطوي على الكثير من الازدواجية ، أليس كذلك؟

+1 على وجود إعداد عالمي ، في حالة الاستخدام الخاصة بي أريد تشغيل خادم وكيل أيضًا

ashtonsix لما يستحق ، كان OP واضحًا في رأيي. أود إعادة فتح هذه المشكلة.

يمكنك إنشاء jest-environment مخصص ، انظر jest-environment-node أو jest-environment-jsdom وقم بفئته الفرعية. يجب أن يسمح لك بإعداد البيئة بأي طريقة تريدها. ناقشنا إضافة خطاف غير متزامن لهذا أيضًا ، ويسعدني قبول العلاقات العامة لذلك.

+1 أراد أن يجرب الدعابة القادمة من المخاوي وقد أعجب بسهولة jest-codemods والمستندات ، حتى علقت مع نفس المشكلة.

كان كل ملف describe الأول من كل ملف منفصل يستغرق وقتًا طويلاً بشكل مدهش للتنفيذ. تبين أن الإعداد كان - كما أوضحت التعليقات السابقة - يتم تشغيله مرة واحدة لكل ملف ، مما أدى إلى الكثير من العمليات غير الضرورية التي تستغرق وقتًا طويلاً مثل DROP DATABASE ، CREATE DATABASE ، والمزيد.

لسوء الحظ ، لا يوجد حل بديل في المستندات (والذي أتى بي بدوره إلى هنا) باستثناء تشغيل node setup.js && jest وهو أمر غير مثالي ..

+1 للإعداد العالمي. مثل المستخدمين الآخرين ، أود إعداد التطبيق / قاعدة البيانات وتفكيكها مرة واحدة فقط.

+1

ثابت في # 4506

هناك خيارات الدعابة التالية globalSetup و globalTeardown . https://facebook.github.io/jest/docs/en/configuration.html#globalsetup -string

لقد حاولت استخدام globalSetup ، ومع ذلك ما زلت أتلقى الخطأ التالي .. أعتقد أن هذا الخيار قد يفي بالغرض @ shai32. ومع ذلك ، لا يبدو لي أن أجعلها تعمل 🤣 ...

"jest": "^21.2.1"
 "jest": {
    "globalSetup": "./jest-config.js"
  }



md5-d3a1dcf99642fcf0b9c99c838aadb689



● Validation Warning:

  Unknown option "globalSetup" with value "./jest-setup.js" was found.
  This is probably a typing mistake. Fixing it will remove this message.

  Configuration Documentation:
  https://facebook.github.io/jest/docs/configuration.html

لم يتم الافراج عنه بعد. 22 دعابة واردة في أي يوم الآن 🙂

ثابت في # 4506

أعلم أنه مرتبط به ، ولكن لأي شخص يبحث: https://github.com/facebook/jest/pull/4716

btav هذا 2 البق 😓

  1. عليك استخدام المسار المطلق الآن ، أو ("../../../~ root ~")
  2. تحذيرات التحقق إيجابية كاذبة

انظر هنا
أيضا # 5093

يجب إصلاح الخلل بالرقم 5095 # 5096

هل يمكن استخدام هذا لتعيين متغير عالمي؟ حاولت لكن لم تنجح .... هل هذا حسب التصميم؟

حالة الاستخدام الخاصة بي هي أن لدي وظيفة سجل مخصصة أريد تعيينها عالميًا. لقد جربت _setup.test.js ، لكن لم يتم نقل المتغيرات العامة الخاصة بي.

zwhitchcox استخدم خيار تكوين ملفات الإعداد: https://facebook.github.io/jest/docs/en/configuration.html#setupfiles -array

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

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

"jest": {
    "verbose": true,
    "testEnvironment": "node",
    "globalSetup": "<rootDir>/scripts/testSetup.js",
    "globalTeardown": "<rootDir>/scripts/testTeardown.js"
  },
// globalSetup.js
module.exports = async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  bot = Bot(browser, page);
  await bot.goto(bot.baseUrl);
  global.bot = bot;
}

لكنني غير قادر على الوصول إلى الروبوت في حالات الاختبار الخاصة بي.

GGWP! فقط حلها.

"e2e": "jest --testRegex '.*.e2e.js'"
// globalTeardown.js
module.exports = async () => {
  if (process.testSetup) {
    process.testSetup.bot.close();
  }
}

 process.testSetup = { bot };
// and then im my tests
const { bot } = process.testSetup;

ويتساءل أي شخص ما هو الروبوت ،

const Bot = (browser, page) => ({
  browser: browser,
  page: page,
  baseUrl: 'http://localhost:4000',
  user: {
    name: faker.name.findName(),
    email: faker.internet.email(),
    password: 'Test<strong i="13">@123</strong>',
  },
  oldUser: {
    email: '[email protected]',
    password: 'Test<strong i="14">@123</strong>',
  },
  clearSession: async () => {
    await page.evaluate(() => sessionStorage.clear());
  },
  goto: async (url) => {
    await page.goto(url);
  },
  clickButton: async (id) => {
    await page.waitForSelector(id);
    await page.click(id);
  },
  checkText: async (expect, id, text) => {
    await page.waitForSelector(id);
    const elText = await page.$eval(id, el => el.innerHTML);
    expect(elText).toContain(text);
  },
  type: async (id, text) => {
    await page.waitForSelector(id);
    await page.$eval(id, el => el.value = '');
    await page.type(id, text);
  },
  wait: async () => {
    await page.waitForNavigation();
  },
  close: () => {
    browser.close();
  },
});

يوجد دليل لمحرك الدمى على الموقع: https://facebook.github.io/jest/docs/en/puppeteer.html

نعم ، لكن هذا يشير إلى أن إعداد طريقة غير متزامنة للإعداد العالمي في GlobalSetup أمر ممكن ، والتي لا يبدو أنها ليست كذلك وفقًا لما ورد أعلاه.

SimenB آه .. يا رجل ... كنت أحاول معرفة ذلك وكنت أيضًا في مستندات الدعابة لفترة طويلة ولم ألاحظ هذا القسم أبدًا. النفايات من وقتي.

لدي مشكلة حيث لا تتوفر الكائنات العامة التي قمت بتعيينها في GlobalSetup إذا كانت هناك مجموعات اختبار متعددة تعمل بالتوازي (هذا افتراضيًا). تشغيل اختبار مجموعة واحدة ، تكون الكائنات متاحة أو إذا قمت بتعيين --runInBand لتشغيل الاختبارات بشكل متسلسل. كيف يمكنني الوصول إلى المتغيرات التي قمت بتعيينها في GlobalSetup إذا كانت الاختبارات تعمل بالتوازي؟
لقد جربت المثال المستخدم أعلاه (باستخدام كائن العملية) وجربت أيضًا الإصدار الذي أستخدم فيه بيئة TestEnvironment مخصصة ولكن دون حظ:

const PuppeteerJsdomEnvironment = require('jest-puppe-shots/lib/jsdom-environment');

class JestPuppeShotsEnv extends PuppeteerJsdomEnvironment {

  async setup(config) {
    await super.setup(config);
    const { allThemesCss } = global;

    // make the allThemesCss object available in test suites
    Object.assign(this.global, {
      allThemesCss
    });
  }
}

module.exports = JestPuppeShotsEnv;

هذا هو الحصول على allThemesCss من globalSetup.js والتأكد من تمريره إلى مجموعات الاختبار.

@ ovidiu-lapadus لقد تمكنت من تشغيل globalSetup باستخدام process بدلاً من global. يعمل مع وبدون --runInBand . على سبيل المثال

// globalSetup.js
module.exports = async () => {
  process.FOOT = 'BALL';
};
// globalTeardown.js
module.exports = async () => {
  console.log(process.FOOT) // BALL 
};
// some.test.js
it('expects 1 to be 1', () => {
    expect(1).toBe(1);
     console.log(process.FOOT); // BALL
});

وبالنسبة إلى فريق الدعابة ، لست متأكدًا من سبب عدم تحديد global s في الاختبارات (babel-jest 22.2.2) ، ولكن تم تحديدها في globalTeardown.js . ربما يكون هذا خطأ. في الوقت الحالي ، سأستخدم فقط process . هتافات!

شكرا cellis لقد أنقذت يومي! كنت أضرب رأسي بالحائط في محاولة لفهم سبب عدم عمل global.FOO . process.FOO يفعل الحيلة :-)

kalutheo هناك بعض المحاذير لاستخدام process.FOO. أولاً ، لا أعتقد أنه يمكنك عمل متغيرات متداخلة بعمق في العملية أو process.env. لقد اكتشفت طريقة أفضل للحصول على عمل globals ، لكنني كنت أنتظر نشرها. ما فعلته هو استخدام حزمة jest-environment لإنشاء dbEnvironment الخاص بي. هناك ، أتحقق من تحديد dbs العام ، وإذا لم يكن الأمر كذلك ، فأنا أعيد تعريفها. يتم تشغيل بيئة قاعدة البيانات فقط لاختبارات db ، ولدي تكوين آخر لاختبارات الواجهة الأمامية فقط. بهذه الطريقة ، لا أضيع الوقت في إجراء اختبارات db لكل تغيير في الواجهة الأمامية. ثانيًا ، لدي طريقة لإعداد ديسيبلات متعددة "نسخ متماثلة" تكون دائمًا ساخنة - فأنت لست بحاجة إلى ترحيلها أو تفريغها في كل جولة دعابة ، حيث أقوم بترحيلها مع dev db (يمكنك رؤية لمحات من هذا في الجوهر الذي قمت بمشاركته) ، مما يسمح بإجراء الاختبارات بشكل أسرع. أقوم بإعداد مجموعة من هذه النسخ المتماثلة حتى أتمكن من الحصول على أقصى قدر من التوازي في الاختبارات. إنه نوع موثق في وثائق الدعابة ، لكن لم يتم شرحه بشكل كافٍ. على أي حال ، إليك جوهر الموضوع: https://gist.github.com/cellis/08cc332dacf9a548005e8cf35d4b16e2

@ ovidiu-lapadus عند الفحص الدقيق ، أعتقد أنه ربما تكون مشكلتك هي أنك اتصلت بـ super.setup() قبل تخصيص الكرة الأرضية. يرجى الاطلاع على المحتوى الذي نشرته أعلاه للحصول على حل عملي.

cellis شكرا لهذه المعلومات القيمة. سأحاول مع بيئة مخصصة مثل التي وصفتها

يا رفاق ، أليس من المفترض أن يتضمن globalSetup هنا جميع مهام heave مثل babel-polyfill ، تتحد مع chai ، تتطلب jest-extended ؟
يبدو أن globalSetup يعمل بشكل مختلف تمامًا عن setupTestFrameworkScriptFile وما نجح هناك لا يعمل في globalSetup .
أعلم أن كل حالة اختبار مزحة يتم تشغيلها في بيئة snadboxed الخاصة به ولكن لا تفعل أشياء في setupTestFrameworkScriptFile تجعل الاختبار لتشغيل veeeeeeeeery بطيئًا.

موكا: 9 ث
الدعابة: الستينيات ، في وضع الساعة: 170 ثانية -200 ثانية

؟

استخدام process هو اختراق من المحتمل أن ينكسر (إنه خطأ).

ربما تريد متابعة # 7184

هذا ليس beforeAll() عالميًا كما هو مطلوب في السؤال ، ولكن مع هذا ، يمكنك بسهولة تجنب تكرار الكود. يمكنك إنشاء بيئة عقدة ، والتي سيتم إعدادها لجميع ملفات الاختبارات الخاصة بك: https://stackoverflow.com/a/61260044/4934640


تحديث

اكتشفت أنه يمكنني تعيين متغير بيئة على globalSetup ، مما يعني أنه يمكنني مشاركة عنوان الخادم بين حالات / مجموعات / ملفات الاختبارات: https://github.com/facebook/jest/issues/7184# طلب الإصدار -612003555

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