κΈλ‘λ² beforeAllμ λν λ°©λ²μ΄ μμ΅λκΉ?
κ° ν μ€νΈ νμΌμμ beforeAllμ μ μν μ μμ§λ§ μ΄κ²μ κ° ν μ€νΈ νμΌμ λν΄ beforeAllμ ν λ² μ€νν©λλ€.
ν λ² μ€νλκ³ μ²« λ²μ§Έ ν μ€νΈκ° μμλκΈ° μ μ μλ£λλ μ μ beforeAllμ΄ μμ΅λκΉ?
setupFiles λ₯Ό λ³΄μ ¨μ΅λκΉ?
μ°Έκ³ λ‘ λ΄ νλ‘μ νΈλ λ€μκ³Ό κ°μ΄ setupFiles
λ₯Ό μ¬μ©ν©λλ€.
package.json
{
"jest": {
"setupFiles": [
"./private/mocks/runtime.js"
]
}
}
./private/mocks/runtime.js
global.__meteor_runtime_config__ = {ROOT_URL: 'localhost'};
μ°Έκ³ λ‘ μ€ν μ€λ²νλ‘λ μ΄λ° μ’ λ₯μ μ§λ¬Έμ λ μ ν©ν μ μμ΅λλ€. (λ²κ·Έ 리ν¬νΈ/κΈ°λ₯ μμ² λμ μ¬μ©μ λν μ§λ¬Έ).
λν λλ μ΄ λ¬Έμ μ ꡬλ μ μ·¨μνμΌλ―λ‘ νμ ν΄λ μλ¦Όμ λ°μ§ μμ΅λλ€.
λλ create-react-appμ μ¬μ©νκ³ μμ΅λλ€.
κ° ν
μ€νΈ νμΌμ λν΄ setupFilesκ° λ€μ μ€νλ©λλ€.
μ³μ§ μμ λλ΅μ νκ³ κ·Έ λ€μ λ¬Έμ λ₯Ό λ«μ΅λλ€. λΈλΌλ³΄!
@cpojer @ashtonsix λλ μ΄κ²μ΄ λ«νμΌνκ³ λλ΅μ΄ μ ννμ§ μλ€κ³ μκ°ν©λλ€ setupFiles
λλ setupTestFrameworkScriptFile
λͺ¨λ κ° ν
μ€νΈ μ€μνΈμ λν΄ μ€νλλ―λ‘ "μ μ"μ΄ μμ΅λλ€. μ°λ¦¬κ° μ€μ ν μμλ κ³³μ ν
μ€νΈνκΈ° μ μ ν
μ€νΈ dbλ₯Ό μ²μνλ κ²κ³Ό κ°μ΅λλ€.
package.jsonμ pretest
λ₯Ό κ°μ§ μ μμ΅λκΉ?
@ Negan1911 - μλ§λ, νμ§λ§ OPμμ μλ―Ένλ λ°λ₯Ό λ§νκΈ°λ μ΄λ ΅μ΅λλ€. μ μ©ν κΈ°λ₯μ΄λΌκ³ μκ°νκ³ μ΄ κΈ°λ₯ μμ²μ λ³΄λ€ λͺ ννκ² νκ³ μΆλ€λ©΄ λ λ²μ§Έ λ¬Έμ λ₯Ό λ§λλ κ²μ κ³ λ €ν΄ λ³Ό μ μμ΅λλ€.
@cpojer @ashtonsix λ΄κ° μ¬λ°λ₯΄κ² μ΄ν΄νλ€λ©΄ νμ¬ Mochaμμ λ
Όμλ κ²μ²λΌ μ μ μ€μ λ° λΆν΄λ₯Ό ν μ μμ΅λλ€.
λ(κ·Έλ¦¬κ³ μλ§λ OP)κ° κ°μ§κ³ μλ μ μ€ μΌμ΄μ€λ μλ²λ₯Ό μ€νν λ€μ λͺ¨λ ν΅ν© ν
μ€νΈλ₯Ό μ€ννκ³ μΆλ€λ κ²μ
λλ€.
μ΄λ₯Ό μννκΈ° μν μ‘°μΈμ΄λ λͺ¨λ² μ¬λ‘κ° μμ΅λκΉ?
λ΄κ° μ°Ύμ κ²μ μ¬λλ€μ΄ μ£Όλ‘ μλ²λ₯Ό μμνκ³ "λ‘컬" beforeAll/afterAllμ κ° ν
μ€νΈ μ€μνΈμ λν΄ μλ²λ₯Ό λ«μΌλΌκ³ λ§νλ κ²μ
λλ€(μ: @kentcdodds ). νμ§λ§ λ§μ μ€λ³΅μ μμν©λλ€.
μ μ μ€μ μ +1, λ΄ μ¬μ© μ¬λ‘μμλ νλ‘μ μλ²λ μ€ννκ³ μΆμ΅λλ€.
κ°μΉκ° μλ @ashtonsix , μ μκ°μλ OPκ° λͺ ννμ΅λλ€. μ΄ λ¬Έμ κ° λ€μ μ΄λ ΈμΌλ©΄ ν©λλ€.
μ¬μ©μ μ μ jest-environment
λ₯Ό λ§λ€κ³ jest-environment-node
λλ jest-environment-jsdom
λ₯Ό λ³΄κ³ νμ λΆλ₯ν μ μμ΅λλ€. μνλ λ°©μμΌλ‘ νκ²½μ μ€μ ν μ μμ΄μΌ ν©λλ€. μ΄μ λν λΉλκΈ° νν¬ μΆκ°μ λν΄μλ λ
ΌμνμΌλ©° μ΄μ λν PRμ μλ½νκ² λμ΄ κΈ°μ©λλ€.
+1 mochaμμ λμ€λ λλ΄μ μλνκ³ μΆμκ³ jest-codemods
μ μ©μ΄ν¨κ³Ό λ¬Έμμ κΉμ μΈμμ λ°μμ΅λλ€.
κ° κ°λ³ νμΌμ λͺ¨λ μ²μ describe
μ μ€ννλ λ° λλΌμΈ μ λλ‘ μ€λ μκ°μ΄ κ±Έλ Έμ΅λλ€. μ΄μ μ£Όμμμ μ€λͺ
ν λλ‘ μ€μ μ΄ νμΌλΉ ν λ² μ€νλμ΄ DROP DATABASE
, CREATE DATABASE
λ±κ³Ό κ°μ λΆνμν μκ° μλͺ¨ μμ
μ΄ λ§μ΄ λ°μνμ΅λλ€.
λΆννλ λ¬Έμμλ μ΄μμ μ΄μ§ μμ node setup.js && jest
λ₯Ό μ€ννλ κ²μ μ μΈνκ³ λ λ¬Έμμ ν΄κ²° λ°©λ²μ΄ μμ΅λλ€.
μ μ μ€μ μ κ²½μ° +1μ λλ€. λ€λ₯Έ μ¬μ©μμ λ§μ°¬κ°μ§λ‘ μ±/DBλ₯Ό ν λ²λ§ μ€μ νκ³ ν΄μ νκ³ μΆμ΅λλ€.
+1
#4506μμ μμ λ¨
λ€μκ³Ό κ°μ λλ΄ μ΅μ
globalSetup
λ° globalTeardown
κ° μμ΅λλ€. https://facebook.github.io/jest/docs/en/configuration.html#globalsetup -λ¬Έμμ΄
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
μμ§ μΆμλμ§ μμμ΅λλ€. Jest 22λ μ΄μ μΈμ λ μ§ μμ λ©λλ€ π
#4506μμ μμ λ¨
λλ κ·Έκ²μ΄ κ±°κΈ°μ λ§ν¬λμ΄ μλ€λ κ²μ μκ³ μμ§λ§ μ°Ύκ³ μλ μ¬λμ μν΄ : https://github.com/facebook/jest/pull/4716
@btav 2 λ²κ·Έμ λλ€ π
μ¬κΈ°λ₯Ό μ°Έμ‘°νμμμ€
μμ #5093
λ²κ·Έλ #5095 #5096μΌλ‘ μμ λμ΄μΌ ν©λλ€.
μ μ λ³μλ₯Ό μ€μ νλ λ° μ¬μ©ν μ μμ΅λκΉ? μλνμ§λ§ μλνμ§ μμ΅λλ€....μ΄κ²μ΄ μλλ κ²μ λκΉ?
λ΄ μ¬μ© μ¬λ‘λ μ μμ μΌλ‘ μ€μ νλ €λ μ¬μ©μ μ§μ λ‘κ·Έ κΈ°λ₯μ΄ μλ€λ κ²μ
λλ€. _setup.test.js
μλνμ§λ§ μ μ λ³μκ° μ μ‘λμ§ μμ΅λλ€.
@zwhitchcox λ setupFiles κ΅¬μ± μ΅μ μ μ¬μ©ν©λλ€: 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 async λ©μλμμ μ μ μ€μ μ΄ κ°λ₯ν¨μ μμν©λλ€.
@SimenB ah .. man... λλ μ΄κ²μ μμλ΄λ €κ³ λ Έλ ₯νκ³ λν κ½€ μ€λ«λμ λλ΄ λ¬Έμμ μμκ³ κ·Έ μΉμ μ κ²°μ½ λμΉμ±μ§ λͺ»νμ΅λλ€. λ΄ μκ° λλΉ.
μ¬λ¬ ν
μ€νΈ λͺ¨μμ΄ λ³λ ¬λ‘ μ€νλλ κ²½μ° 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;
μ΄κ²μ globalSetup.jsμμ allThemesCλ₯Ό κ°μ Έμ€κ³ ν μ€νΈ μ€μνΈλ‘ μ λ¬λκ³ μλμ§ νμΈν©λλ€.
@ovidiu-lapadus global λμ process
λ₯Ό μ¬μ©νμ¬ globalSetupμ μλμν¬ μ μμμ΅λλ€. --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
});
κ·Έλ¦¬κ³ jest νμ global
κ° ν
μ€νΈ ( babel-jest 22.2.2 )μμ μ μλμ§ μμμ§λ§ globalTeardown.js
μμ μ μλμλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. μλ§λ λ²κ·ΈμΌ κ²μ
λλ€. μ§κΈμ process
λ§ μ¬μ©νκ² μ΅λλ€. 건배!
κ°μ¬ν©λλ€ @cellis λΉμ μ λ΄ ν루λ₯Ό ꡬνμ΅λλ€! global.FOO
μ΄ μλνμ§ μλ μ΄μ λ₯Ό μ΄ν΄νλ €κ³ λ²½μ 머리λ₯Ό λΆλͺμ³€μ΅λλ€. process.FOO
μ΄ νΈλ¦μ μνν©λλ€ :-)
@kalutheo process.FOOλ₯Ό μ¬μ©ν λ λͺ κ°μ§ μ£Όμ μ¬νμ΄ μμ΅λλ€. 첫째, νλ‘μΈμ€ λλ process.envμμ κΉμ΄ μ€μ²©λ λ³μλ₯Ό μνν μ μλ€κ³ μκ°ν©λλ€. μ μμ μλμν€λ λ μ’μ λ°©λ²μ μ°Ύμμ§λ§ κ²μνκΈ°λ₯Ό κΈ°λ€λ¦¬κ³ μμμ΅λλ€. λ΄κ° ν κ²μ jest-environment ν¨ν€μ§λ₯Ό μ¬μ©νμ¬ λλ§μ dbEnvironment
λ₯Ό λ§λλ κ²μ
λλ€. κ±°κΈ°μμ μ μν μ μ dbλ₯Ό νμΈνκ³ κ·Έλ μ§ μμ κ²½μ° μ¬μ μν©λλ€. λ°μ΄ν°λ² μ΄μ€ νκ²½μ db ν
μ€νΈμ©μΌλ‘λ§ μ€νλλ©° νλ‘ νΈμλ μ μ© ν
μ€νΈμ©μΌλ‘ λ€λ₯Έ ꡬμ±μ΄ μμ΅λλ€. κ·Έλ κ² νλ©΄ λͺ¨λ νλ°νΈμλ λ³κ²½μ λν΄ db ν
μ€νΈλ₯Ό μ€ννλ λ° μκ°μ λλΉνμ§ μμ΅λλ€. λμ§Έ, νμ ν«ν μ¬λ¬ "볡μ " dbλ₯Ό μ€μ νλ λ°©λ²μ΄ μμ΅λλ€. dev dbμ ν¨κ» λ§μ΄κ·Έλ μ΄μ
νκΈ° λλ¬Έμ λͺ¨λ jest μ€νμμ λ§μ΄κ·Έλ μ΄μ
νκ±°λ λ€νν νμκ° μμ΅λλ€. μ΄κ²μ λ΄κ° 곡μ ν μμ§μ μμ), ν
μ€νΈλ₯Ό ν¨μ¬ λ λΉ λ₯΄κ² μ€νν μ μμ΅λλ€. ν
μ€νΈμμ μ΅λ λ³λ ¬μ±μ μ»μ μ μλλ‘ μ΄λ¬ν 볡μ λ³Έμ νμ μ€μ ν©λλ€. κ·Έκ²μ μΌμ’
μ jest λ¬Έμμ λ¬Έμνλμ΄ μμ§λ§ μΆ©λΆν μ€λͺ
λμ΄ μμ§ μμ΅λλ€. μ΄μ¨λ μμ§λ λ€μκ³Ό κ°μ΅λλ€. https://gist.github.com/cellis/08cc332dacf9a548005e8cf35d4b16e2
@ovidiu-lapadus μμΈν μ΄ν΄λ³΄λ©΄ λ¬Έμ λ μ μμ ν λΉ νκΈ° μ μ super.setup()
λ₯Ό νΈμΆν κ²μΌ μ μμ΅λλ€. μλνλ μ루μ
μ λν΄μλ μμ κ²μν μμ§λ₯Ό μ°Έμ‘°νμμμ€.
@cellis κ·μ€ν μ 보 κ°μ¬ν©λλ€. λλ λΉμ μ΄ μ€λͺ ν κ²κ³Ό κ°μ μ¬μ©μ μ μ νκ²½μΌλ‘ μλ ν κ²μ λλ€
μλ€ μ, globalSetup
babel-polyfill
μ κ²°ν© chai
, μꡬ jest-extended
μ κ°μ λͺ¨λ heave μμ
μ μ¬κΈ°μ ν¬ν¨ν΄μΌ νμ§ μμ΅λκΉ?
globalSetup
λ setupTestFrameworkScriptFile
μ λ§€μ° λ€λ₯΄κ² μλνκ³ globalSetup
μμλ μλνμ§ μλ κ² κ°μ΅λλ€.
λλ λͺ¨λ jest ν
μ€νΈ μΌμ΄μ€κ° κ·Έμ snadboxed νκ²½μμ μ€νλμ§λ§ setupTestFrameworkScriptFile
μμ μ무κ²λ νμ§ μλλ€λ κ²μ μκ³ μμ΅λλ€.
λͺ¨μΉ΄: 9μ΄
Jest: 60μ΄, μκ³ λͺ¨λμμ: 170-200μ΄
?
process
λ₯Ό μ¬μ©νλ κ²μ μλ§λ κΉ¨μ§ μ μλ ν΄νΉμ
λλ€(λ²κ·Έμ
λλ€).
λΉμ μ μλ§λ #7184λ₯Ό νλ‘μ°νκ³ μΆμ κ²μ λλ€.
μ΄κ²μ μ§λ¬Έμ λν μ 체 beforeAll()
κ° μλμ§λ§ μ΄λ₯Ό ν΅ν΄ μ½λ μ€λ³΅μ μ½κ² νΌν μ μμ΅λλ€. λͺ¨λ ν
μ€νΈ νμΌμ λν΄ μ€μ ν λ
Έλ νκ²½μ λ§λ€ μ μμ΅λλ€. https://stackoverflow.com/a/61260044/4934640
μ λ°μ΄νΈ
globalSetup
μ νκ²½ λ³μλ₯Ό μ€μ ν μ μλ€λ κ²μ μμμ΅λλ€. μ¦, ν
μ€νΈ μ¬λ‘/suites/files κ°μ μλ² μ£Όμλ₯Ό 곡μ ν μ μμ΅λλ€. https://github.com/facebook/jest/issues/7184# μ΄μμ½λ©νΈ
κ°μ₯ μ μ©ν λκΈ
μ μ μ€μ μ κ²½μ° +1μ λλ€. λ€λ₯Έ μ¬μ©μμ λ§μ°¬κ°μ§λ‘ μ±/DBλ₯Ό ν λ²λ§ μ€μ νκ³ ν΄μ νκ³ μΆμ΅λλ€.