Mocha: ๋ฐ˜๋ณต์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ํŒจํ„ด๋ณ„๋กœ ํŠน์ • ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋Š” ์˜ต์…˜

์— ๋งŒ๋“  2015๋…„ 03์›” 04์ผ  ยท  71์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mochajs/mocha

ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ํŒŒ์ผ ๋งŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์™ธ ํŒจํ„ด์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด ํ•ฉ๋ฆฌ์ ์ธ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ํ•œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๊ณผ ๊ณต์กด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹จ์ˆœํžˆ glob ignore ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ? ์›ํ•˜์‹ ๋‹ค๋ฉด ์ •๋ง ๋นจ๋ฆฌ PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

feature good-first-issue help wanted usability

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

image

๋ชจ๋“  71 ๋Œ“๊ธ€

๋‘ ๊ฐœ์˜ ๋ณ‘๋ ฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ…Œ์ŠคํŠธ ์šฉ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š”
๋ฐ์ดํ„ฐ ํŒŒ์ผ ์šฉ. ๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.
์˜ค์ „ 04.03.2015 15:52 schrieb "Kyle P Davis" [email protected] :

๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์™ธ ํŒจํ„ด์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚ด ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋งŒ. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
ํ•ฉ๋ฆฌ์ ์ธ ์กฐ๊ฑด์„ ๋”ฐ๋ฅด๋Š” ํ•œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๊ณผ ๊ณต์กดํ•˜๋Š” ํŒŒ์ผ
๋ฌด๋Šฌ.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹จ์ˆœํžˆ ์˜ต์…˜ ๋ฌด์‹œ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
glob์—์„œ.

์ƒ๊ฐ? ์›ํ•˜์‹ ๋‹ค๋ฉด ์ •๋ง ๋นจ๋ฆฌ PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/mochajs/mocha/issues/1577.

๋‚˜๋Š” (๊ณผ๊ฑฐ์—) ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ glob ignore๊ฐ€ ๋ฐ”๋กœ ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ๊ทธ๋ ‡๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

glob ignore ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ น ์ค„ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ์ƒ๊ฐ์„ ์–ป๊ณ  ์กฐ๊ธˆ ๋จผ์ € ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ PR ์ž‘์„ฑ์— ๋Œ€ํ•œ ์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋„ ์ด๊ฒƒ ๋งŒ ํ•„์š”ํ•˜๊ณ  ๋ชจ์นด๊ฐ€ ์•„์ง ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒƒ์„๋ณด๊ณ  ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ํด๋” ์•ˆ์— "testApp"์ด ์žˆ์Šต๋‹ˆ๋‹ค. mocha๊ฐ€ ํ•ด๋‹น ํด๋” ๋‚ด์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํ•˜์œ„ ํด๋”๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ํฌํ•จ ํ•  ํ•„์š”์—†์ด ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด mocha.opts ํŒŒ์ผ์— ์ œ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

testApp์„ ์˜ฎ๊ธธ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ €์žฅ์†Œ์˜ ๋‹ค๋ฅธ ๊ณณ์— ๋งž์ง€ ์•Š์œผ๋ฉฐ ํ…Œ์ŠคํŠธ ํด๋”์˜ ํŠน์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ข‹์€ ์ถ”๊ฐ€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

์ด๊ฒŒ ํ•„์š”ํ•˜๋ฉด ์•„๋งˆ ๊ทธ๋ƒฅ

$ mocha $(find test/ ! -path '*testApp*')

๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์ •๋ง ํฅ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‰˜ ๋ช…๋ น Makefile , Gruntfile.js , gulpfile.js ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— recursive ํ”Œ๋ž˜๊ทธ์˜ ์กด์žฌ์— ๋Œ€ํ•ด์„œ๋„ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค gulpfile.js ๋“ฑ

@boneskull ์ด ์ข‹์€ ์ง€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ์™„์ „ํžˆ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ตฌ์กฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

$ tree .
.
โ””โ”€โ”€ spec
    โ”œโ”€โ”€ fixtures
    โ”œโ”€โ”€ integration
    โ””โ”€โ”€ unit

4 directories, 0 files

npm test ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก package.json์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

  "scripts": {
    "test": "mocha spec/unit spec/integration"
  }

๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ :

$ tree .
.
โ””โ”€โ”€ src
    โ””โ”€โ”€ models
        โ”œโ”€โ”€ user.js
        โ””โ”€โ”€ userSpec.js

2 directories, 2 files

@boneskull ์˜ˆ์ œ์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์–‘์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( Spec ํฌํ•จํ•˜๋Š” ํŒŒ์ผ ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค).

  "scripts": {
    "test": "mocha $(find src -name '*Spec.js')"
  }

ํŽธ์ง‘ : ๊ณ ์ • :)

@danielstjules ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ด๋ฆ„์— Spec ๋กœ ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. -name '*.spec.js' ๋ฅผ) ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

๋„ค, ๋งž์•„์š”! Brainfart. ์ง€์  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ๋œ ๋ช…๋ น :

  "scripts": {
    "test": "mocha $(find src -name '*Spec.js')"
  }

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ๋ณ„๋กœ ํŒŒ์ผ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ ํ…Œ์ŠคํŠธ์ค‘์ธ ๋…ผ๋ฆฌ๊ฐ€ ํฌํ•จ ๋œ ํŒŒ์ผ ์˜†์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ด๋ฆ„ ์ง€์ •์€ file ์ธ์ˆ˜ ๋˜๋Š” grep ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์ผ๊ด€๋˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ node_modules ๊ฐ™์€ ๊ฒƒ์€ ๋ช…์‹œ ์ ์œผ๋กœ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ฐพ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด -gulp-mocha ๋Š” ์ด๊ฒƒ์„ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ๋‚˜๋Š” ๋‹จ์ง€ ๋‚ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ณณ์— gulp ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

์ž ์‹œ ์‹œ๊ฐ„์„๋‚ด์–ด์ด ์•„์ด๋””์–ด๋ฅผ +1ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ JavaScript ํ”„๋กœ์ ํŠธ์™€ ๋‹ฌ๋ฆฌ ์ €๋Š” GO๊ฐ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ณ  ํ…Œ์ŠคํŠธ๋˜๋Š” ๋ชจ๋“  ๋‹จ์ผ ํŒŒ์ผ ์˜†์— ์‚ฌ์–‘ ํŒŒ์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

main.js
main.spec.js
utilities.js
utilities.spec.js

์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์กฐ์ง์€ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์˜ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ…Œ์ŠคํŠธ๊ฐ€ ํ…Œ์ŠคํŠธํ•˜๋Š” ํŒŒ์ผ ๋ฐ”๋กœ ์˜†์— ์œ„์น˜ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ๋‚ด ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐฐํฌ ๋œ ๋ฒ„์ „์˜ ๋ชจ๋“  .spec.js ํŒŒ์ผ์„ ์Šคํฌ๋ฆฝํŠธํ•ฉ๋‹ˆ๋‹ค.

๋น„ํ‘œ์ค€ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์ธํ•ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํด๋”๋กœ ๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ Windows ์ƒ์ž๊ฐ€ ์—†์ง€๋งŒ ์ฐพ๊ธฐ ๊ตฌ๋ฌธ์ด Windows์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ œ์™ธ ์˜ต์…˜์ด ํ›จ์”ฌ ๋” ์ง๊ด€์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๊ฑฐ์˜ ๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ์—๋Š” ์–ด์จŒ๋“  ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํŒจ๋ฆฌํ‹ฐ๊ฐ€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋Š” *.test.js ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ tests ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์™ธํ•˜๊ณ  ์‹ถ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ์œผ๋ฉฐ ./test/**/*.js mocha์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์† ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒํ•˜๋‚˜์š”?

๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ„์— ํ…Œ์ŠคํŠธ๋ฅผ ์ด๋™ํ•˜๋ฉด VCS์—์„œ ๋งŽ์€ ์†Œ์Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@calebthebrewer ๊ณ ๋ง™๊ฒŒ๋„ ํ”„๋กœ์ ํŠธ์—์„œ

+1 @calebthebrewer

Angular 2.0๊ณผ Polymer๋Š” ๊ตฌ์„ฑ ์š”์†Œ ๋ชจ๋“œ์— ์žˆ์œผ๋ฏ€๋กœ @KrisSiegel์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฒˆ๋“ค๋กœ ์œ ์ง€ํ•˜๋ฉด ๊น”๋”ํ•˜๊ณ  ๋ชจ๋“ˆ ์‹์ด๋ฉฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์šด ํŒŒ์ผ ๊ณ„์ธต์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ q promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ๋กœ๋“œํ•˜๋Š” ๋ฐ ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

import q from 'q';

import authRouterTest from '../app/routes/_authentication.router.e2e.js';

import productRouterTest from '../app/routes/_product.router.e2e.js';

import productModelTest from '../app/models/product.model.spec.js';

// Dynamically constructed sequence of functions
let funcs = [ productModelTest(), authRouterTest(), productRouterTest() ];

// This function takes an array of promise-producing functions and
// runs them sequentially.
let execTests = () => {

    let result = q();

    funcs.forEach((f) => {

        result = result.then(f);
    });

    return result;
};

// Execute tests
execTests();

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์–ด๋””์—์„œ๋‚˜ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ test/ ์— ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋งŒ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ํ…Œ์ŠคํŠธ ๋ธ”๋ก ๋‚ด์—์„œ ์•ฝ์†์„ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋ž˜ํ•‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import q from 'q'

export default () => {

    let Q = q.defer();

    describe('something', () => {

        it('should', (done) => {

            ...
        });
    });

    describe('something', () => {

        it('should', (done) => {

            ...
        });

        it('should', (done) => {

            ...

            Q.resolve('test complete');
        });
    });

    return Q.promise;
};

๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์—†๋‹ค๋ฉด ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ glob์— ๋Œ€ํ•ด ๋ฌด์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. bash ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

+1

node_modules ์ œ์™ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Exclusion ๋Š” recursive ์˜ ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๋™๋ฐ˜์ž์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@godspeedelbow ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋ช…์‹œ ์ ์œผ๋กœ ๋ฌด์‹œ๋˜์–ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ node_modules ์ด ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

FWIW, ๋‚˜๋„ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋ณด๋‹ค ํ›จ์”ฌ ๋” ํ™•์žฅ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์€ ๋” ์ž˜ ๊ตฌ์„ฑ ํ•  ์ˆ˜์žˆ๊ฒŒ ํ•ด์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (ํ”ฝ์Šค๋Š” ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ IMHO์— ์†ํ•ฉ๋‹ˆ๋‹ค).

node_modules ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ (์˜ˆ : ํ…Œ์ŠคํŠธํ•˜๋Š” ํŒŒ์ผ ์˜†์— ์‚ฌ์–‘ ํŒŒ์ผ์„ ๋ณด๊ด€ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๋–จ์–ด์ง„ ๋‹จ์ผ ํด๋”์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด) ๋˜๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ๋ฐ ํฌํ•จ ๋œ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ (์•„๋งˆ๋„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” npm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ผ ์ˆ˜ ์žˆ์Œ)์— ๋Œ€ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€๋งŒ ์ž์ฒด ์ข…์†์„ฑ ๋‚ด์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .

์ด ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ 1 ๋…„ ๋™์•ˆ ๋ฐœ์ƒ ํ–ˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„ ๋  ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์ด๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์—๋Š” ํ”Œ๋žซํผ ๋ณ„ ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ํŒจํ„ด์„ ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์— ์ถ”๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํฌํฌํ•˜๊ณ  ์ง์ ‘ ํ•  ๊ฒƒ์ด์ง€๋งŒ ๊ฐ ๋””๋ ‰ํ† ๋ฆฌ์™€ ํŒจํ„ด์„ ์ง€์ •ํ•˜๋Š” ํ•ดํ‚ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชจ์นด์— ๊ตฌํ˜„ํ•  ์‹œ๊ฐ„์„ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ์Šต๋‹ˆ๋‹ค.

@KrisSiegel ํ•ญ์ƒ src/**/*.js ๋ฐ src/**/*.spec.js ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Go ๋ฐ Rust ํ”„๋กœ์ ํŠธ์—์„œ ๋” ์ž์ฃผ ๋ด…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ํ›„์ž๋Š” ๋น„๊ต์  ๋“œ๋ฌผ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹œ๊ฐ„์„๋‚ด์–ด ์Šค์Šค๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ํŒจ์น˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋…ผ๋ฆฌ๊ฐ€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ ์ƒํƒœ ๊ธฐ๊ณ„ ์—‰๋ง์ด ์•„๋‹Œ ๊ฒฝ์šฐ).

ํ•„์ž๋Š” Mocha, Jasmine, Tape ๋“ฑ์˜ ์™„์ „ํ•œ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ์ž์ฒด ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ž‘์—…ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์žฅ๋‚œ๊ฐ ํ”„๋กœ์ ํŠธ ATM์—์„œ๋„ ์—ฌ์ „ํžˆ ์ง„ํ–‰์ค‘์ธ ์ž‘์—…์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉํ•˜๊ธฐ ์œ„ํ•ด Mocha๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ˆ์ •ํ™” ๋  ๋•Œ๊นŒ์ง€ ์ฒ˜์Œ์— Chai๋ฅผ ๋‹จ์ •์— ์‚ฌ์šฉํ–ˆ๋‹ค.

๋„ค, ๊ทธ๊ฒƒ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ŠคํŽ™๊ณผ ์†Œ์Šค ํŒŒ์ผ์„ ์ง ์ง“๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๋˜‘๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋œ ๋งŽ์€ JavaScript ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ทธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๋ฏธ ์ž์ฒด ์‚ฌ์šฉ์ž ์ง€์ • ๋นŒ๋“œ ์‹œ์Šคํ…œ์œผ๋กœ ๊ฝค ํฐ ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ํ•ญ์ƒ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

Exclude๋Š” ๋งŽ์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ชจ์นด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :). ์ด ๋ฌธ์ œ๋Š” ํ”Œ๋žซํผ ๋ณ„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ข…๊ฒฐ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒจ์น˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ์นด ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์ด๋ฉด ๋ช‡ ์ฃผ ์•ˆ์— ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ํ™•์‹คํžˆ ํŒจ์น˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@KrisSiegel ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ œ๋กœ ํŒจ์น˜๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด, ์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ด๋‚˜ ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ํ•œ ์•„๋งˆ๋„ ๋ณ‘ํ•ฉ ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. FWIW, ์•„์ง _this_์— ๋Œ€ํ•œ PR์ด ์—†์œผ๋ฉฐ ํ”Œ๋žซํผ ์ข…์†์  ์„ ๊ณ ๋ คํ•˜๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ์ข…๊ฒฐ ๋œ ์ด์œ ๋Š” ๋งค์šฐ ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด GNU find ์„ (๋ฅผ) ์„ค์น˜ํ•˜๋ ค๋Š” Windows ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ซํ˜€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ Node์˜ ๊ตฌํ˜„์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ( ๋‹ซํžŒ ๋ฌธ์ œ , PR ์ง„ํ–‰ ์ค‘ ) Node with Web workers ์—์„œ ์ด๋ฏธ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์น˜์— ๋Œ€ํ•ด +1ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” app ๋˜๋Š” src ํด๋”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ด ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ์–‘์˜ ๋ช…๋ช… ๋œ ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋‹จ์ผ ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ๋ฒˆ๋“ค๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

.mochaignore ๋˜๋Š” ๋‹ค๋ฅธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์‹œํ•  ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์ด์ƒ์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด **/*.spec.js glob์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  node_modules ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฑ์ •์€ํ•˜์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค.

๊ฑฐ์˜ ๋ชจ๋“  ๋‹ค๋ฅธ ๋นŒ๋“œ ๋„๊ตฌ์—์„œ์ด๋ฅผ ํ—ˆ์šฉํ•˜๋ฉฐ .npmignore , .gitignore , .jshintignore , jscs๋Š” .jscsrc ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ ์  ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์–‘๋ง ์„œ๋ž ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ / ๊ธฐ๋Šฅ ํŒŒ์ผ ๋ฐ ํด๋” ๊ตฌ์„ฑ์œผ๋กœ ์ด๋™ํ•จ์— ๋”ฐ๋ผ Mocha๋„ ์ง€์›ํ•œ๋‹ค๋ฉด ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@isiahmeadows ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜์—†๋Š” ํด๋” ๊ตฌ์กฐ์— ๊ฐ‡ํ˜€ ์žˆ์œผ๋ฏ€๋กœ services/ , routes/ ๋“ฑ์ด node_modules ์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค. node_modules ๋ฅผ ์ œ์™ธํ•˜๋Š” ์„ธ ๋ฒˆ์งธ ๋„๊ตฌ (๋ช…๋ น ์ค„, ๊ฟ€๊บฝ ๊ฟ€๊บฝ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ)๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋‚ด ํ…Œ์ŠคํŠธ ๋งŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผํ• ์ง€ ์•Œ์•˜๋‹ค๋ฉด ๋ชจ์นด๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. :)

@godspeedelbow @adambuczynski ์ž„์‹œ ํ•ด๊ฒฐ์ฑ… :)

  "scripts": {
    "test": "mocha $(find . -name '*.spec.js' ! -ipath '*node_modules*')"
  }

์•ˆ๋…•ํ•˜์„ธ์š” @danielstjules ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์‹œ๋„ํ–ˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ find . -name '*.spec.js' ! -ipath '*node_modules*' ๋Š” ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋งŒ ์ฐพ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ๋”ฐ๋ฅด๋Š” ํŒจํ„ด์— ๋งž๊ฒŒ '*.spec.js' ์„ ์—…๋ฐ์ดํŠธ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด _all_ js ํŒŒ์ผ๊ณผ ์ผ์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  "scripts": {
    "test": "mocha $(find . -name '*.js' ! -ipath '*node_modules*')"
  }

@danielstjules๋Š” ํ™˜ํ˜ธํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ์ฐฝ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด ์•ฑ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์ €ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ ์•ฑ ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๋ฅผ app ํ•˜์œ„ ํด๋”๋กœ ์ด๋™ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์šฉ์œผ๋กœ ํ•ด๋‹น ํด๋”๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  node_modules ๋˜๋Š” ๋‹ค๋ฅธ ํด๋”์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋„๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

@danielstjules ์˜ˆ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํŒŒ์ผ์€ *.spec.js ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ์ด์ „์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด์ œ๋Š” ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. * NIX ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค๊ฐ€์˜ค๋Š” ์ „๊ณต์—์„œ์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ .mochaignore ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@boneskull ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” mocha.opts ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ์˜ต์…˜ ์ „๋‹ฌ์„ ์œ„ํ•ด๋ณด๋‹ค "ํ‘œ์ค€"์ธ .mocharc ๊ตฌํ˜„์„ ๊ณ ๋ ค ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? test ํด๋”์— ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋ฉด Mocha๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๊ทธ๊ฒƒ์€์ด ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ•์š”ํ•˜์ง€ ๊ฒƒ์ด๋ผ๊ณ  test ํด๋” ๋‹จ์ง€์— ๋Œ€ํ•œ mocha.opts . (์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค).

@adambuczynski ์ ˆ๋Œ€์ ์œผ๋กœ. ์ €๋Š” mocha.opts ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@adambuczynski ์ข‹์€ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ .mocharc ์˜ต์…˜ ํŒŒ์ผ๋„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์˜†์— ํ…Œ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ํ…Œ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+1, ์ œ์™ธ๊ฐ€ ์ •๋ง ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@adambuczynski @boneskull ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด --opts ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ opts ํŒŒ์ผ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ˆ์ œ๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ mocha --opts .mocharc ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @GRUBES. ๊ฒฐ๊ตญ์—๋Š” ํ…Œ์ŠคํŠธ ์„ค์ • ๋„์šฐ๋ฏธ๋„ ๋ฐฐ์น˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— test ํด๋”๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Glob์—๋Š” ignore ์˜ต์…˜์ด ์žˆ์œผ๋ฏ€๋กœ exlude ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  glob ignore๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฌด์‹œ ํŒจํ„ด ๋˜๋Š” glob ํŒจํ„ด ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ผ์น˜๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ  : ๋ฌด์‹œ ํŒจํ„ด์€ ๋‹ค๋ฅธ ์„ค์ •์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ dot : true ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์™œ 1 ๋…„ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. :-)

@ inf3rno BTW, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ œ๋กœ ์•‰์•„ ํŒจ์น˜๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด์ด ๋ฌธ์ œ๋Š” ํ›จ์”ฌ ๋” ์ผ์ฐ ํ•ด๊ฒฐ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@isiahmeadows ๊ทธ๋ž˜ ,ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‚ด๊ฐ€ ์•„๋‹ˆ์•ผ. :๋””

๊ทธ๋ž˜๋„ PR์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? test ๋ฐ test-integration ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋Œ€์‹  ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ฝ” ๋กœ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ์ผ๋ฐ˜์ ์ธ ์ข…๋ฅ˜์˜ ๋ช…๋ น ์ค„ ์˜ต์…˜์ด ์•„๋‹Œ ํŒŒ์ผ ๋งŒ์žˆ๋Š” 2036์—๋Š” PR # 2173์ด ์žˆ์Šต๋‹ˆ๋‹ค.

--exclude ์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜๋Š” mocha test/*.js !test/_*.js ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜์„ธ์š”

๊ณ„์‚ฐ ๋œ Glob : mocha "./{,!(node_modules)/**/}*.test.js" ๋Š” node_modules๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  * .test.js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  mocha "./test/**/!(notThisOne).js" ๋Š” notThisOne.js๋ฅผ ์ œ์™ธํ•œ ํ…Œ์ŠคํŠธ ํด๋”์™€ ํ•˜์œ„ ํด๋”์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋˜ํ•œ๋ณด์‹ญ์‹œ์˜ค:
https://github.com/isaacs/node-glob#glob -primer
https://github.com/isaacs/node-glob/issues/62

์•ˆ๋…•ํ•˜์„ธ์š”.

ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•˜๋ฉด

mocha "./{,!(node_modules)/**/}*.test.js"
-bash: !: event not found

์ด ๋ฌธ์ž๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@mdumouchel ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

node_modules/mocha/lib/utils.js:630
        throw new Error("cannot resolve path (or pattern) '" + path + "'");
              ^
Error: cannot resolve path (or pattern) './{,!(node_modules)/**/}*.test.js'

๊ฒฐ๊ตญ find ๋ช…๋ น์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

mocha $(find . -type d -name node_modules -prune -o -name '*.test.js')

@mdumouchel ๋ฒ„์ „ 2.x (์ฆ‰, npm์—์žˆ๋Š” ๊ฒƒ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์–ด์จŒ๋“  ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 3.x, IIRC์—์„œ ์ง€์›์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Bash์—์„œ ์‹œ๋„ํ•ด ๋ณด์•˜๊ณ  ํฐ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ Windows์™€ Bash์—์„œ ๋ชจ๋‘ ์ž‘๋™ํ•˜๋Š” ๊ตฌ๋ฌธ / ์ด์Šค์ผ€์ดํ”„๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ "cannot resolve path"์˜ค๋ฅ˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์ด์Šˆ ์ฃผ์„์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๋ง์ณ ๋†“์ง€ ์•Š๋Š” ํ•œ, ํ•ด๋‹น ์†Œ์Šค ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ด๋ฆ„์ด ".test.js"๋กœ ๋๋‚˜๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด์žˆ์„ ๋•Œ ๋‚ด๊ฐ€ ์ค€ ๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ๋ฒ„์ „์—์„œ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

# 2173 ์ฐธ์กฐ

Eslint ๋Š” --ignore-path (๋ฐ .eslintignore )๊ฐ€์žˆ๋Š” ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ์ž‘์—…์„ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ์กฐ : http://eslint.org/docs/user-guide/command-line-interface#ignoring -files

๋ชจ์นด์™€ ๋น„์Šทํ•œ ๊ฒƒ์ด ๊ต‰์žฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. : two_hearts :


๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• :

eslint "test/!(fixtures)/**/*.js" "test/*.js"

๋‚ด ํŒŒ์ผ ๊ตฌ์กฐ

.
โ””โ”€โ”€ src
โ””โ”€โ”€ test
    โ””โ”€โ”€ fixtures
        โ””โ”€โ”€ data.js
    โ”œโ”€โ”€ foo.js
    โ””โ”€โ”€ bar.js

๋ฌธ์ œ : Mocha๋Š” ๋‘ ๊ฒฝ๋กœ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด Error: cannot resolve path (or pattern) ๋ฅผ์ค๋‹ˆ๋‹ค. : disappointed_relieved :

์ข‹์•„, ๋‚˜๋Š” ์ง„์ •ํ•ด. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. --exclude <glob-or-path>
  2. --exclude ์˜ _multiple_ ์ธ์Šคํ„ด์Šค ์ง€์›
  3. ๋ชจ๋“  --exclude ์˜ต์…˜๊ณผ ๋ชจ๋“  ๋น„ ์˜ต์…˜ ์ธ์ˆ˜๋ฅผ ๋‹จ์ผ ๋ชฉ๋ก์œผ๋กœ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ์ ์œผ๋กœ globby ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…).
  4. ํ•ด๋‹น ํŒŒ์ผ๋กœ๋“œ

ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ glob ์ผ ์ˆ˜์žˆ๋Š” _n_ ๋น„ ์˜ต์…˜ ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ _additive_๋ฟ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

$ mocha 'src/**/*.spec.js' '!src/forbidden/**/*.spec.js'

๋”ฐ๋ผ์„œ ์œ„์˜ ๋‚ด์šฉ์ด ์ž‘๋™ํ•˜๊ณ  --exclude ๋Š” ! ์„คํƒ•์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ .mochaignore (# 2036) ์ง€์›์€ ์ข‹๊ฒŒ ๋“ค๋ฆฌ์ง€๋งŒ ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. .gitignore ๊ฐ™์€ ๋™์ž‘์„ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ์–ด ์˜ฌ ์ˆ˜์žˆ๋Š” 3p ๋ชจ๋“ˆ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ESLint๊ฐ€ํ•˜๋Š” ์ผ์ด ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

... ๊ทธ๋ฆฌ๊ณ  ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ช…๋ น ์ค„์—์„œ ์ธ์šฉ๋˜์ง€ ์•Š์€ glob์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. # 2355 ์ฐธ์กฐ

๋†€๋ž๊ฒŒ๋„ --ignore-path ์™€ ๊ฐ™์€ ์˜ต์…˜์ด ์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ tests ํด๋”์— ๋„ฃ๋Š” ๊ฒƒ ์™ธ์— ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋„ฃ์„ ์ˆ˜์—†๋Š” ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

+1
ํŒจํ„ด๋ณ„๋กœ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํ—‰ํ—‰

ํ•ญ์ƒ src / / .js ๋ฐ src / /.spec.js ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. **/* ํŒจํ„ด ์ผ์น˜๊ฐ€ ๊นจ์ ธ์„œ ์žฌ๊ท€ ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : @ScottFreeCode ๋Š” ์•„๋ž˜์— ๋Œ€๋‹ตํ•ฉ๋‹ˆ๋‹ค.

**/* ํŒจํ„ด ์ผ์น˜๊ฐ€ ๋Š์–ด์ง€๊ณ  ์žฌ๊ท€ ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ๊ฒฝ๋กœ๊ฐ€ ์ธ์šฉ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

+1

image

https://github.com/zinserjan/mocha-webpack/issues/124์— ์„ค๋ช… ๋œ๋Œ€๋กœ :

src/ ์•ˆ์—๋Š” server.ts ๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.์ด ํŒŒ์ผ์€ ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ์ด ํŒŒ์ผ ๋งŒ ์ œ์™ธ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์—๋„ ๊ด€๋ฆฌ์ž๋Š” ์—ฌ์ „ํžˆ ์„ค๋“๋ ฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ์นด๋Š” ๋ฌด์‹œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋‚ด ์˜๊ฒฌ์„ ํ‘œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ์นด๋Š” ์บ๋…ผ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ์—ด๋งํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ธฐ๋Šฅ ์„ธํŠธ์— ๋Œ€ํ•œ ๊ธฐ์ค€์„ ๋†’์ด๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ Bash์—๊ฒŒ ๋งก๊ธฐ๋ ค๋Š” ์—ด๋ง์„ ๊ทธ๋งŒ๋‘ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ 2017 ๋…„.

๋˜ํ•œ Windows ์‚ฌ์šฉ์ž๋Š” Bash์˜ !(glob) (์‹ค์ œ๋กœ POSIX ํ‘œ์ค€์ด ์•„๋‹Œ Bash-ism)๊ณผ ๋™๋“ฑํ•œ ๊ฒƒ์ด ์—†๋‹ค๋Š” ์ ์„ ์ง€์  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Glob JS ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— Mocha์˜ globbing์—๋Š” Bash ์ข…์†์„ฑ์ด ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. (์ฐธ๊ณ  : ๊ฒฝ๋กœ๋ฅผ ์ธ์šฉ์€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ป๊ฒŒ ๋ชจ์นด๋Š” ๊ฒƒ ๋‹ค๋ฅด๊ฒŒ ์‰˜ ์ฒ˜๋ฆฌ globs์™€ ํ”ผํ•ด์•ผํ•œ๋‹ค ** globstar ํ™•์žฅํ•˜์ง€ ์•Š๊ณ ์ด๋“  ๊ทธ๊ฒƒ์€ ๊ทธ ์ฐจ์ข…์€ ํŠน๋ณ„ํ•˜๋‹ค.)

@ScottFreeCode glob์„ ์‚ฌ์šฉํ•  ๋•Œ extglob: true ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (glob / minimatch๊ฐ€ ํ•ด๋‹น ์˜ต์…˜์ด ํ™œ์„ฑํ™” ๋œ ์ƒํƒœ์—์„œ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—).

glob์— ๊ฒฝ๋กœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ glob ํŒจํ„ด์„ ํ†ตํ•ด ์ž‘์—…ํ•˜๋Š” ๋ถ€์ •์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ๋ชจ๋“ˆ์˜ ์ด์ „ ๋ฒ„์ „ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ์ด์ค‘ ๋ณ„ ๋™์ž‘์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ผ๋ถ€ ๋ถ€์ • ํŒจํ„ด๋„ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ (๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ ์žˆ๋Š” globbing ํ…Œ์ŠคํŠธ์—์„œ ๊ฒฐํ•จ์„ ๋ฐœ๊ฒฌ ํ•œ ๊ฒฝ์šฐ) ๊ทธ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

๊ทธ๋Ÿฌ๋‚˜ ๋ช…์‹œ์ ์ธ ignore / exclude ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ™•์‹คํ•œ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋œ ๋ชจํ˜ธํ•œ
  • ๋‹ค๋ฅธ OS ํŠน์ˆ˜ ๋ฌธ์ž ๋ฐ ์ธ์šฉ ๊ทœ์น™๊ณผ์˜ ์ถฉ๋Œ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ํฌํ•จ ๋ชฉ๋ก์—์„œ ์ œ์™ธ ๋ชฉ๋ก์„ ๋บ€ ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ถ€์ • ๋œ ๋ถ€๋ถ„์ด์žˆ๋Š” ํฌํ•จ ๋ชฉ๋ก๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์ƒ ์œ ์ง€๊ฐ€ ํŠน์ • ์…ธ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋ช…ํ™•ํžˆํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ; ^)

ํฌํ•จ ๋ชฉ๋ก์—์„œ ์ œ์™ธ ๋ชฉ๋ก์„ ๋บ€ ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ถ€์ • ๋œ ๋ถ€๋ถ„์ด์žˆ๋Š” ํฌํ•จ ๋ชฉ๋ก๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๋‚˜๋Š” ๊ฑฐ์˜ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

์ด ๋ฌธ์ œ์— ์˜ค๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ :

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด์ œ ์ง€์›๋˜์–ด์•ผํ•˜๋ฏ€๋กœ glob์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์ด ํŠน์ • ํ–‰๋™์„ ์›ํ•˜๋ฉด PR์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.

--exclude ์˜ต์…˜์ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
๋ฌธ์„œ ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ sepo-one ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด PR ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.
mocha -h ๋Œ€ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์˜ต์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ์ด์ „ ๋ฒ„์ „์˜ ๋ชจ์นด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๊ณ  --exclude ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ๋ฌธ์„œ๋Š” ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @outsideris

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰