Jest: global sebelumSemua

Dibuat pada 15 Jun 2017  ·  36Komentar  ·  Sumber: facebook/jest

apakah ada cara untuk beforeAll global?

Saya dapat mendefinisikan beforeAll di setiap file pengujian tetapi ini akan menjalankan beforeAll sekali untuk setiap file pengujian.

apakah ada global beforeAll yang akan dijalankan sekali dan selesai sebelum tes pertama dimulai?

Komentar yang paling membantu

+1 untuk pengaturan global. Seperti pengguna lain, saya ingin mengatur dan merobohkan aplikasi/DB hanya sekali.

Semua 36 komentar

Pernahkah Anda melihat setupFiles ?

Untuk referensi proyek saya menggunakan setupFiles seperti ini:

package.json

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

./private/mocks/runtime.js

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

FYI Stack Overflow mungkin tempat yang lebih baik untuk pertanyaan semacam ini. (pertanyaan tentang penggunaan alih-alih laporan bug/permintaan fitur).

Saya juga telah berhenti berlangganan dari masalah ini sehingga tidak akan mendapatkan pemberitahuan jika Anda membalas.

Saya menggunakan create-react-app.
dan setupFiles berjalan lagi untuk setiap file pengujian.

memberikan jawaban yang tidak benar dan menutup masalah setelahnya. selamat!

@cpojer @ashtonsix Saya tidak berpikir ini harus ditutup dan jawabannya tidak benar, keduanya setupFiles atau setupTestFrameworkScriptFile berjalan untuk setiap test suite, jadi tidak ada "global" sebelumnyaSemua di mana kita dapat mengatur pemikiran seperti membersihkan db pengujian sebelum pengujian

Anda dapat memiliki pretest di package.json?

@Negan1911 - mungkin, tapi sulit untuk mengatakan apa yang dimaksud di OP. Anda dapat mempertimbangkan untuk membuat masalah kedua jika menurut Anda itu adalah fitur yang berguna & ingin lebih memperjelas permintaan fitur ini?

@cpojer @ashtonsix Jika saya memahaminya dengan benar, saat ini pengaturan dan pembongkaran global tidak mungkin dilakukan seperti yang dibahas di sini di Mocha .
Kasus penggunaan yang saya (dan mungkin OP) miliki adalah bahwa saya ingin menjalankan server dan hanya kemudian semua tes integrasi saya (dan mungkin setelah semuanya dijalankan, jatuhkan tes DB).
Apakah Anda memiliki saran atau praktik terbaik untuk melakukan ini?
Apa yang saya temukan adalah kebanyakan orang menyuruh untuk memulai server dan menutupnya untuk setiap rangkaian uji di "lokal" beforeAll/afterAll, misalnya di sini oleh @kentcdodds , tetapi menyiratkan banyak duplikasi, bukan?

+1 untuk memiliki pengaturan global, dalam kasus penggunaan saya, saya juga ingin menjalankan server proxy

@ashtonsix untuk apa nilainya, menurut saya OP jelas. Saya ingin masalah ini dibuka kembali.

Anda dapat membuat jest-environment kustom, lihat jest-environment-node atau jest-environment-jsdom dan mensubklasifikasikannya. Seharusnya memungkinkan Anda untuk mengatur lingkungan dengan cara apa pun yang Anda suka. Kami juga mendiskusikan untuk menambahkan pengait async untuk ini, dan saya senang menerima PR untuk itu.

+1 Ingin mencoba lelucon yang berasal dari moka dan terkesan dengan kemudahan jest-codemods dan dokumen, hingga saya terjebak dengan masalah yang sama.

Setiap describe pertama dari setiap file terpisah membutuhkan waktu yang sangat lama untuk dieksekusi. Ternyata pengaturannya - seperti yang dijelaskan oleh komentar sebelumnya - dijalankan sekali per file, menghasilkan banyak operasi yang memakan waktu yang tidak perlu seperti DROP DATABASE , CREATE DATABASE , dan banyak lagi.

Sayangnya tidak ada solusi dalam dokumen (yang pada gilirannya membawa saya ke sini) kecuali menjalankan node setup.js && jest yang tidak ideal..

+1 untuk pengaturan global. Seperti pengguna lain, saya ingin mengatur dan merobohkan aplikasi/DB hanya sekali.

+1

Diperbaiki di #4506

Ada opsi lelucon berikut globalSetup dan globalTeardown . https://facebook.github.io/jest/docs/en/configuration.html#globalsetup -string

Saya telah mencoba menggunakan globalSetup , namun saya terus mendapatkan kesalahan berikut.. Saya pikir opsi ini mungkin berhasil @shai32. Namun, sepertinya saya tidak bisa membuatnya bekerja ...

"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

Ini belum dirilis. Jest 22 masuk setiap hari sekarang

Diperbaiki di #4506

Saya tahu ini tertaut di dalamnya, tetapi bagi siapa saja yang mencari: https://github.com/facebook/jest/pull/4716

@btav itu 2 bug

  1. anda harus menggunakan jalur absolut untuk saat ini, atau ("../../../~ root ~")
  2. peringatan validasi salah positif

lihat disini
juga #5093

bug harus diperbaiki dengan #5095 #5096

Bisakah ini digunakan untuk mengatur variabel global? Saya mencoba, tetapi tidak berhasil .... apakah ini desain?

Kasus penggunaan saya adalah saya memiliki fungsi log khusus yang ingin saya atur secara global. Saya mencoba _setup.test.js , tetapi variabel global saya tidak ditransfer.

@zwhitchcox gunakan opsi konfigurasi setupFiles: https://facebook.github.io/jest/docs/en/configuration.html#setupfiles -array

Terkadang mungkin berguna untuk membagikan variabel global yang disetel melalui fungsi async. Misalnya, akan berguna untuk menyiapkan browser dalang sekali di globalSetup dan kemudian menelurkan halaman baru di setiap rangkaian pengujian/pengujian.

@tdenovan Itulah tepatnya yang saya coba lakukan sekarang. Tapi sepertinya tidak berhasil. Saya telah melakukan ini di moka sebelumnya dan itu sangat mudah, tetapi dengan bercanda saya pikir saya perlu mencari cara lain.
Ini adalah konfigurasi lelucon saya

"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;
}

Tetapi saya tidak dapat mengakses bot dalam kasus pengujian saya.

GGWP! Baru saja menyelesaikannya.

"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;

dan ada yang bertanya-tanya apa itu bot,

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();
  },
});

Ada panduan untuk dalang di situs web: https://facebook.github.io/jest/docs/en/puppeteer.html

Ya, tetapi itu menunjukkan bahwa pengaturan global dalam metode async globalSetup dimungkinkan, yang menurut di atas sepertinya tidak b

@SimenB ahh.. man... Saya mencoba mencari tahu ini dan juga berada di dokumen lelucon untuk waktu yang cukup lama dan tidak pernah memperhatikan bagian itu. Buang-buang waktu saya.

Saya memiliki masalah di mana objek global yang saya atur di globalSetup tidak tersedia jika ada beberapa rangkaian pengujian yang dijalankan secara paralel (ini secara default). Menjalankan tes suite tunggal, objek tersedia atau jika saya mengatur --runInBand untuk menjalankan tes secara serial. Bagaimana saya bisa mendapatkan akses ke variabel yang saya atur di globalSetup jika tes berjalan secara paralel?
Saya mencoba contoh yang digunakan di atas (menggunakan objek proses) dan saya juga mencoba versi di mana saya menggunakan TestEnvironment khusus tetapi tidak berhasil:

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;

Ini mendapatkan allThemesCss dari globalSetup.js dan memastikan itu diteruskan ke suite pengujian.

@ovidiu-lapadus Saya bisa membuat globalSetup bekerja dengan menggunakan process alih-alih global. Ia bekerja dengan dan tanpa --runInBand . Misalnya

// 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
});

Dan untuk tim lelucon, saya tidak yakin mengapa global s tidak terdefinisi dalam tes ( babel-jest 22.2.2 ), tetapi didefinisikan dalam globalTeardown.js . Mungkin itu bug. Untuk saat ini saya hanya akan menggunakan process . Bersulang!

Terima kasih @cellis Anda menyelamatkan hari saya! Saya membenturkan kepala ke dinding mencoba memahami mengapa global.FOO tidak berfungsi. process.FOO berhasil :-)

@kaluteo Ada beberapa peringatan untuk menggunakan process.FOO. Pertama, saya tidak berpikir Anda dapat melakukan variabel yang sangat bersarang pada process atau process.env. Saya menemukan cara yang lebih baik untuk membuat global bekerja, tetapi apakah saya menunggu untuk mempostingnya. Apa yang telah saya lakukan, adalah menggunakan paket jest-environment untuk membuat dbEnvironment saya sendiri. Di sana, saya memeriksa dbs global untuk didefinisikan dan jika tidak, saya mendefinisikannya kembali. Lingkungan basis data hanya dijalankan untuk pengujian db, saya memiliki konfigurasi lain untuk pengujian frontend saja. Dengan begitu, saya tidak membuang waktu menjalankan tes db untuk setiap perubahan frontend. Kedua, saya memiliki cara untuk menyiapkan beberapa db "replika" yang selalu panas -- Anda tidak perlu memigrasikan atau membuangnya pada setiap lelucon, karena saya memigrasikannya bersama dengan dev db (Anda dapat melihat sekilas ini dalam Intisari yang telah saya bagikan ), yang memungkinkan pengujian berjalan lebih cepat. Saya menyiapkan kumpulan replika ini sehingga saya bisa mendapatkan parelelisme maksimum dalam pengujian. Ini semacam didokumentasikan dalam dokumentasi lelucon, tetapi tidak dijelaskan dengan cukup baik. Bagaimanapun, inilah intinya: https://Gist.github.com/cellis/08cc332dacf9a548005e8cf35d4b16e2

@ovidiu-lapadus Setelah diperiksa lebih dekat, saya pikir mungkin masalah Anda adalah Anda menelepon super.setup() sebelum menetapkan global Anda. Silakan lihat Intisari yang saya posting di atas untuk solusi yang berfungsi.

@cellis terima kasih atas informasi berharga ini. Saya akan mencoba dengan lingkungan khusus seperti yang Anda jelaskan

Kawan, bukankah globalSetup seharusnya menyertakan semua tugas heave seperti babel-polyfill , digabungkan dengan chai , memerlukan jest-extended ?
Tampaknya globalSetup bekerja jauh berbeda dari setupTestFrameworkScriptFile dan apa yang berhasil di sana tidak bekerja di globalSetup .
Saya tahu, bahwa setiap kasus uji lelucon dijalankan di lingkungan snadbox-nya tetapi tidak melakukan hal-hal di setupTestFrameworkScriptFile membuat pengujian berjalan sangat lambat.

Moka: 9 detik
Lelucon: 60-an, dalam mode arloji: 170-200-an

?

Menggunakan process adalah peretasan yang mungkin akan rusak (ini adalah bug).

Anda mungkin ingin mengikuti #7184

Ini bukan beforeAll() global semua seperti yang ditanyakan pada pertanyaan, tetapi dengan ini, Anda dengan mudah menghindari duplikasi kode. Anda dapat membuat lingkungan simpul, yang akan disiapkan untuk semua file pengujian Anda: https://stackoverflow.com/a/61260044/4934640


Memperbarui

Saya baru tahu bahwa saya dapat mengatur variabel lingkungan pada globalSetup , artinya saya dapat membagikan alamat server antara kasus/suite/file pengujian: https://github.com/facebook/jest/issues/7184# komentar masalah

Apakah halaman ini membantu?
0 / 5 - 0 peringkat