Mocha: ES6์˜ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ this.timeout()์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค

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

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด "use strict" ๋ฐ ES6 ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ Node >= 4๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ mocha๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

describe('foo', () => {
  this.timeout(100);
});

# => TypeError: this.timeout is not a function

ES5 ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

describe('foo', function() {
  this.timeout(100);
});

๊ทธ๋ž˜์„œ, this ๋ชจ์นด๋Š” ์–ด๋–ค ์ถ”์•…ํ•œ ์†์ž„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

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

๊ฐ์‚ฌ ํ•ด์š”.

์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ "๋งˆ๋ฒ•"์ด ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋‚˜์š”? ์™œ ์•ˆ๋˜๋‚˜์š”?:

var mocha = require('mocha');

mocha.describe('foo', (suite) => {
  suite.timeout(100);

  suite.it('must love bar', () => ... );  
});

์ „์—ญ๋„ ์—†๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋งˆ๋ฒ•๋„ ์—†๊ณ ... JavaScript๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ์— ํ•จ์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. http://mochajs.org/์—์„œ

screen shot 2015-12-21 at 8 06 34 am

๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค!

๊ฐ์‚ฌ ํ•ด์š”.

์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ "๋งˆ๋ฒ•"์ด ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋‚˜์š”? ์™œ ์•ˆ๋˜๋‚˜์š”?:

var mocha = require('mocha');

mocha.describe('foo', (suite) => {
  suite.timeout(100);

  suite.it('must love bar', () => ... );  
});

์ „์—ญ๋„ ์—†๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋งˆ๋ฒ•๋„ ์—†๊ณ ... JavaScript๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ https://github.com/mochajs/mocha/issues/1969#issuecomment-160925915์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฌ์ž‘์„ฑ์€ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@ibc ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

var mocha = require('mocha');

mocha.describe('foo', (suite) => {
  suite.timeout(100);

  suite.it('must love bar', (suite) => ... );  
});

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ œํ’ˆ๊ตฐ ์ธ์ˆ˜๊ฐ€ ๊ฐ™์€ ์œ ํ˜•์ž…๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

var mocha = require('mocha');

mocha.describe('foo', (suite) => {
  suite.timeout(100);

  suite.it('must love bar', (test) => ... );  
});

์–ด์จŒ๋“  ํ™”์‚ดํ‘œ ์—ฐ์‚ฐ์ž๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์„ค๋“ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, #1969์˜ BDD UI๋ฅผ ๊นจ๋œจ๋ฆด ์ƒ๊ฐ์€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด API๋ฅผ ์œ ์ง€ํ•˜๊ณ  BDD UI๊ฐ€ ํฌํ•จ๋œ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋ฅผ ๋„์ž…ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žŒ์ž…๋‹ˆ๋‹ค. Mocha๋Š” ๊ธฐ์กด API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” BDD UI ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€๋งŒ ์ดํ›„ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BDD UI ํŒจํ‚ค์ง€์˜ ์ƒˆ ๋ฒ„์ „์„ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

describe ๋˜๋Š” suite ๋ž˜ํผ์— ๋Œ€ํ•œ ๋Œ€์ฒด ES6 ๊ตฌ๋ฌธ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

describe({ feature: 'create stuff' , do () {
    it('abc', () => {
    }); 
}})

์ด๊ฒƒ์€ ์ ์–ด๋„ ์Šค์œ„ํŠธ ๋ ˆ๋ฒจ์—์„œ ๋ฐ”์ธ๋”ฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค

mocha = require('mocha');

mocha.describe('test', (suite) => {

suite.timeout(500);

suite.it('test', (done)=>
          )
    }
)

๊ทธ๋ฆฌ๊ณ  TypeError ๊ฐ€์ ธ์˜ค๊ธฐ: ์ •์˜๋˜์ง€ ์•Š์€ 'timeout' ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@mroien ์ด๊ฒƒ์€ Mocha ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ๊ตฌ๋ฌธ์€ function ๋Œ€ํ•œ 1:1 ๋Œ€์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œํ•œ ์‚ฌํ•ญ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค

์ด๊ฒƒ์œผ๋กœ ๋ญ”๊ฐ€๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๊นŒ? ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์‚ฌ๋ž‘ํ•˜๊ณ  ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ '์ด๊ฒƒ'์„ ์‹ซ์–ดํ•œ๋‹ค๋ฉด ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

timeout์€ done ์—๋งŒ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ done ํ•จ์ˆ˜์— timeout ํ•จ์ˆ˜๋ฅผ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

it('makes sense', done => {
    done.timeout(100);
});

@nomilous ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” it ๋ธ”๋ก ๋‚ด์—์„œ setTimeout ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ

it('description', done => {
     const func = () => {
          // assertions
     };
     setTimeout(func, 10000);
});

@nomilous ๋™๊ธฐ ๋˜๋Š” ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@andela-engmkwalusimbi ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. @bonekull ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด

@mroien ์ด๊ฒƒ์€ Mocha ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ๊ตฌ๋ฌธ์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ 1:1 ๋Œ€์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œํ•œ ์‚ฌํ•ญ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค

์—ฌ์ „ํžˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•ดํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ ์—ฌ๊ธฐ๋กœ ๋Œ์•„์™€ ๊ณ„์† ์ฝ์œผ์‹ญ์‹œ์˜ค(์ €๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค).

์ด ๊ฒฝ์šฐ ์ด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ this ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋Œ€์‹  bdd API๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ context ๊ฐœ์ฒด๋ฅผ ๋ชจ๋“  Runnable์˜ (ํ›„ํฌ, ํ…Œ์ŠคํŠธ) ์ฝœ๋ฐฑ์— ์ „๋‹ฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. this . ๊ทธ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์€ ์•„๋‹ˆ์ง€๋งŒ ํš๊ธฐ์ ์ธ ๋ณ€ํ™”์˜ ์ง€์ง„์ด๋ฏ€๋กœ ์ ˆ๋Œ€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹ :

it('should do something', function (done) {
  this.timeout(9000);
  // stuff
  done();
});

๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค :

it('should do something', (context, done) => {
  context.timeout(9000);
  done();
});

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋น„๋™๊ธฐ Mocha ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

it('should do something', function (context, done) {
  // context is unused, but 'done' is now the second parameter
  this.timeout(9000);
  done();
});

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•˜๋Š” ๋Œ€์•ˆ์ ์ธ bdd ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹จ์ง€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ "์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€"์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ฒ ์ €ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. :์›ƒ๋‹ค:

์ฐจ๊ธฐ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ์œ„ํ•ด ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์š”? ๋Œ€์ฒด bdd ๊ตฌํ˜„์„ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ํ–ฅํ›„ ๊ฐœ๋ฐœ์—๋„ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ข…์˜ ํ…Œ์ŠคํŠธ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

it('should do something', function ({ context, done }) { ...

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•˜๋Š” ๋Œ€์•ˆ์ ์ธ bdd ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@boneskull ์ƒˆ๋กœ์šด bdd-es6 ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

.filter(i => i.val) ์™€ ๊ฐ™์€ ๋ฐฐ์—ด ํ•จ์ˆ˜์— ์ •๋ง ์œ ์šฉํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์„ค๋ช…ํ•˜๊ณ  ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•˜๋ฏ€๋กœ ๋งค๋ฒˆ ์š”๊ตฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ this ๊ฐ€ ์–ธ์ œ๋ถ€ํ„ฐ ๋งˆ์ˆ ์ธ์ง€ (ํ™”์‚ดํ‘œ) ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—? ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ž˜์ „์— ava์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ์นด์˜ ๋‹จ์ˆœํ•จ๊ณผ ๊ด€๋ จํ•˜์—ฌ #1969์— ์„ค๋ช…๋œ ์ผ๋ฐ˜/ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์— ํฐ ๋ณ€ํ™”๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—๋””ํ„ฐ๊ฐ€ f ๋ฅผ function () {\n\t\n} ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค๊ณ  ๋งํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” before() ํ˜ธ์ถœ์„ ์‹œ๊ฐ„ ์ดˆ๊ณผํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

    before( async function () {
      data = await provider.getData();
      console.log(data);
      this.timeout(30*1000);
    });

ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์—ฌ์ „ํžˆ 4์ดˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ์œ ์ผํ•˜๊ฒŒ ๋Š๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด mocha.opts ์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ 30์ดˆ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 30์ดˆ ํ›„์— ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ฒซ ๋ฒˆ์งธ describe() ๋Š” ๋šฑ๋šฑํ•œ ํ™”์‚ดํ‘œ ๊ตฌ๋ฌธ ๋Œ€์‹  function ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

describe('Search API', function () {
    this.timeout(30*1000);

    context('search', () => {
        let data;

        before( async () => {
          data = await provider.getSearch();
        });

        it('returns results', () => {
          expect(data).to.exist;
          expect(data.results).to.be.instanceOf(Array);
          expect(data.results.length).to.be.above(0);
        });
    })
});

@chovy await provider.getData() ์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.

before(async function () {
  this.timeout(30*1000); // set timeout first, then run the function
  data = await provider.getData();
  console.log(data);
});

ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” before() ํ˜ธ์ถœ์„ ์‹œ๊ฐ„ ์ดˆ๊ณผํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ๋กœ์„œ๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Mocha์˜ timeout ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š”(ํ•˜์ง€๋งŒ ์žฅ์ ์ด ์žˆ๋”๋ผ๋„) ๊ฐ€๋Šฅํ•œ ์ƒˆ๋กœ์šด(๋˜๋Š” ์ตœ์†Œํ•œ ์ˆ˜์ •๋œ) ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋…ผ์˜์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž ์‹œ ๋™์•ˆ ๋งˆ์Œ์†์— ํ’ˆ๊ณ  ์žˆ๋˜ ๊ฒƒ์€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

it('...', (done) => {
  ...
  done()
})

๊ทธ๋ฆฌ๊ณ 

it('...', (t) => {
  t.timeout(500)
  t.tag('integration', 'api')
  ...
  t.done()
})

๋™์ผํ•œ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์˜จ๋ผ์ธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” (done) ๊ตฌ๋ฌธ์€ ํ”Œ๋ž˜๊ทธ๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ ์—†์ด๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ง€์ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ตฌํ˜„์—์„œ๋Š” ๊ธฐ์กด done ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น done ํ•จ์ˆ˜ ๊ฐœ์ฒด์˜ ์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

this.timeout() ํ•˜๋ฉด ๋ณด๊ณ ์„œ์—์„œ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

@dasilvacontin ์šฐ๋ฆฌ๊ฐ€ ๋” ์ผ์ฐ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

@dasilvacontin ์•„, ๊ธฐ์–ต๋‚˜๋„ค์š”. ๋ถˆ๋Ÿฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. @bonekull "์ „ํ™”ํ•ด์•ผ ํ•จ"์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Mocha๊ฐ€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋น„๋™๊ธฐ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

2017๋…„ 1์›” 29์ผ 05:54์— Christopher Hiller [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@dasilvacontin ์•„, ๊ธฐ์–ต๋‚˜๋„ค์š”. ๋ถˆ๋Ÿฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

๋˜ํ•œ 't'๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์˜๋„๋ฅผ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ•ฉ๋‹ˆ๊นŒ?

ํ…Œ์ดํ”„์—์„œ๋Š” ํ•ญ์ƒ '.done'(API์˜ '.end')์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ƒ๋˜๋Š” ์ฃผ์žฅ๋Ÿ‰('t.plan')์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ it()์— ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ API๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

it ('accepts lambda', (done)=>{ doWork();  done(); }, {timeout:60000});

@boneskull

์ปจํ…์ŠคํŠธ๋ฅผ ์ฒซ ๋ฒˆ์งธ๋กœ ๋‘๋Š” ๋Œ€์‹  ๋‘ ๋ฒˆ์งธ ์„ ํƒ์‚ฌํ•ญ์ธ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋Œ€์‹ :

it('should do something', function (done) {
  this.timeout(9000);
  // stuff
  done();
});

๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค :

it('should do something', (done, context) => {
  context.timeout(9000);
  done();
});
it('should do something', function (done, context) {
  // context is unused, but 'done' is now the second parameter
  this.timeout(9000);
  done();
});

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•˜๋Š” ๋Œ€์•ˆ์ ์ธ bdd ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ "์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€"์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ฒ ์ €ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๐Ÿ˜„

๋˜๋Š” ์ปจํ…์ŠคํŠธ๊ฐ€ ์ •์˜๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์—ฌ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

it('should do something', function (done, override) {
  // context is unused, but 'done' is now the second parameter
  override.timeout(9000);
  done();
});

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. :)

done ๊ฐ€ ํ•„์š”ํ•œ ์†”๋ฃจ์…˜์˜ ๋‹จ์ ์€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๋”๋ผ๋„ done ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง์ ‘ ๋งํ•ด์„œ return ๋ณด๋‹ค .then(()=>{done()}, done) function ๋ฐ return ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

@Flamenco ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ด์ง€๋งŒ ๊ธฐ๋Šฅ์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ, ๊ธฐ์ˆ ์ ์œผ๋กœ ๋” "๋งˆ๋ฒ•์ "์ธ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ง์‹œํ•ฉ์‹œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ๋Šฅ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Mocha๊ฐ€ ๊ทธ๋Ÿฌํ•œ "๋งˆ๋ฒ•"์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ๋‹ค๋ฅธ ์ถ”์ƒํ™”๋กœ ๊ณต๊ธ‰๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค); ์ด๋Ÿฌํ•œ ์˜ต์…˜ ๊ฐœ์ฒด๋Š” ํƒœ๊ทธ ๋ฐ/๋˜๋Š” ๋ณด๋ฅ˜ ์ค‘์ธ ํ…Œ์ŠคํŠธ ์ด์œ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์š”์ฒญ๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค(GitHub ๋ฌธ์ œ/PR ๋ชฉ๋ก ๊ฒ€์ƒ‰ ์ƒ์ž์—์„œ ์ฐพ๋Š” ๊ฒƒ์€ ๋…์ž์—๊ฒŒ ์—ฐ์Šต ๋ฌธ์ œ๋กœ ๋‚จ์Œ). ๋™์ •์‹ฌ์„ ์ธ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋“ค์˜ ๋ถ€์žฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋”๋ผ๋„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์‹ค์ œ์— ์ด์ ์ด ์žˆ์Œ).

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

์ปจํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ es6 ์‹คํ–‰์„ ์œ„ํ•ด mocha์˜ ์ผ๋ถ€ ์Šค์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ ๋‚˜๋Š” derpy์ฒ˜๋Ÿผ ๋ณด์ด๋Š” function() ํ˜ธ์ถœ์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ฐจ์ด๊ฐ€ ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ ์„ค๋ช…์„ ๋ž˜ํ•‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ์•ฝ์†์ด mocha๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์— ์ •์˜๋œ ๋‹ค์Œ when ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ์„ ์–ธ์— ์ถ”๊ฐ€ํ•˜๋ฉด: it('does something', when(() => someFunctionReturningAPromise, customTimeout)) ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  mocha ์‹œ๊ฐ„ ์ œํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์šฐ๋ฆฌ๋Š” promise๋กœ๋งŒ ์ž‘์—…ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ณ  ์™„๋ฃŒ๋œ ์ฝœ๋ฐฑ ๋Œ€์‹  ์ปจํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. it('can access the mocha test context', when(testContext => someFunctionThatNeedsContext(testContext))

const when = (lambda, timeout) =>
  function() { // return a plain function for mocha to bind this to
    this.timeout(timeout || this.timeout() || 1000)
    return lambda(this)
  }

์„ค๋ช…ํ•  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€:

const delay = timeout =>
  new Promise((resolve, reject) => setTimeout(resolve, timeout))

const deject = timeout => // similar to above, but a delayed reject
  new Promise((resolve, reject) => setTimeout(reject, timeout))

describe('mocha testing', () => {
  context('with only arrow functions', () => {
    context('tests that do not time out', () => {
      it('passes fast', when(() => delay(10), 100))
      it('does not usually time out', when(() => delay(2000), 2010))
    })
    context('tests that will time out', () => { // these should fail if the 'when' function works properly
      it('times out fast', when(() => delay(1000), 10)) // will fail in 10ms
      it('times out', when(() => delay(1000), 1000)) // will fail in about 1000ms
    })
    context('tests that will reject', () => { // this shows the when function works as expected when a test rejects
      it('fails fast', when(() => deject(10), 100))
    })
  })
})

@astitt-ripple ์˜ˆ, ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ function () {} ... Wtf?

์•Œ์•˜์–ด ๋ฃจ์นด, ๋ฌผ๋ฆฐ๋ฐ. :-)

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€์˜ ์ฐจ์ด์ ์€ ๋ฐ˜ํ™˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—์„œ
es6 ์œ ํ˜• ์„ค์ •, ์ด๊ฒƒ์€ ์ด๋ฏธ promise 'then'์˜ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‡ ์‚ฌ์Šฌ.

๊ธฐ๋Šฅ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์•ˆํ•œ ๋Œ€๋กœ, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ,
์•ฝ์†์€ ๋ช…์‹œ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์˜ ์•ฝ์† ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ
{... }๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ํ•ญ์ƒ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜
์œ ํšจํ•œ ์‚ฌ์†Œํ™”๋Š” ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. function { return ... }. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด
ํ…Œ์ŠคํŠธ๋Š” ๋””์ŠคํŒจ์น˜๋œ ์•ฝ์†์ด ์•„๋‹Œ mocha์— undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ 
ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ž๋Š” ๋‚˜์œ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ promise.then์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ
๋ฐ/๋˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ, ํ•จ์ˆ˜ ๋ฐ˜ํ™˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๊ด€์„ฑ์—†๋Š”. ์ œ์•ˆ๋œ '์–ธ์ œ' ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ „ํ†ต์ ์ธ ๊ธฐ๋Šฅ๋ณด๋‹ค ํ™”์‚ดํ‘œ์™€ ๋” ๊ธฐ๋Šฅ์ ์ธ ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
์ฝœ๋ฐฑ ๋˜๋Š” ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์Šคํƒ€์ผ. ๋” ๊ฐ„๊ฒฐํ•˜๊ณ 
์ปจํ…์ŠคํŠธ ์„ค๋ช… dsl ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
์•ฝ์† ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ถ”์ƒํ™” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ •
์ž˜. ๋˜ํ•œ ์šฐ๋ฆฌ ์นœ๊ตฌ ๊ณฑ์Šฌ์ด ์—†์–ด๋„ function+return๋ณด๋‹ค ์งง์Šต๋‹ˆ๋‹ค.
๋•Œ(() => ...).

์•„๋งˆ๋„ ๊ทธ๊ฒƒ์ด ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์„ ํ˜ธํ•˜๋Š” ์Šคํƒ€์ผ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ”„๋กœ์ ํŠธ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๊ทธ ์ง์ˆ˜
๋‹น์‹ ์˜ wtf๊ฐ€ ์•”์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋น„๋‚œ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์•„. ๋ชจ์นด๋Š” ํ•จ๊ป˜ ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค
์‚ฌ์ „ fp ์นœํ™”์ ์ธ js. ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์€ ์ตœ์šฐ์„  ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. ์ €๊ฒƒ
๋˜ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ์‚ฌ ํ•ด์š”.

์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ... ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์ธ ๊ฒฝ์šฐ ...

...๊ทธ๋Ÿฐ ๋‹ค์Œ ํŠนํžˆ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜(๋˜๋Š” ์˜คํžˆ๋ ค ์„œ๋ธŒ๋ฃจํ‹ด)์˜ ๋™์ž‘์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด this.mutatingMethod(currentConfiguration) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ return (๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ์ž„)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  ์ผ๊ด€๋˜์ง€ ์•Š์€ ๋ชจ์Šต์€ ์‹ค์ œ๋กœ ๋ถˆ์ผ์น˜๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ทธ ํ˜„์‹ค์„ ๋” ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €๋Š” JS์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์•„์ด๋””์–ด์˜ ์ธ๊ธฐ๊ฐ€ ๋†’์•„์ง„ ๊ฒƒ์— ๋งค์šฐ ๋งŒ์กฑํ•˜์ง€๋งŒ function / return vs => ์˜ ๊ตฌ๋ฌธ์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์‹ค์ œ๋กœ ํ•„์ˆ˜์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ด๋Š” ๋ฌธ์ œ์ธ ๋ฐ˜๋ฉด ์ˆœ์ˆ˜์„ฑ ๋ฐ ์„ ์–ธ์  ๋Œ€ ๋ช…๋ นํ˜•๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฐœ๋…์€ ์‹ค์ œ๋กœ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋™์ž‘ / ์˜๋ฏธ๋ก  , ์ด ์‹œ์ ์—์„œ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ์‚ฌ์†Œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค...)

this.timeout์ด ๋Œ์—ฐ๋ณ€์ด์ ์ด๋ฉฐ ๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ this.timeout ์™ธ์— ํ…Œ์ŠคํŠธ๋ณ„๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ mocha ๊ตฌํ˜„์—์„œ๋Š” ๋ช…๋ นํ˜•/๋Œ์—ฐ๋ณ€์ด ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ๋”ฐ๋ผ ์„ค์ •์„ ํฌ๊ธฐํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ํ•˜๋‚˜.

์œ„์˜ when ์ถ”์ƒํ™”์—์„œ ํƒ€์ž„์•„์›ƒ์€ when์˜ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ธฐ๋Šฅ ์Šคํƒ€์ผ์ด ํ…Œ์ŠคํŠธ ์ˆ˜์ค€์—์„œ ์œ ์ง€๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. FP ๋ชจ๋“œ์—์„œ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ์˜ ๋ถˆ๊ฐ€ํ”ผํ•œ ํƒˆ์ถœ์„ ์ˆจ๊ธฐ์ง€๋งŒ ํ•œ ๊ณณ์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— mocha ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ณ ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ…Œ์ŠคํŠธ ์‹คํ–‰์ž ์•„์ด๋””์–ด๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ๊นŒ์ง€ ์ž ์ •์ ์œผ๋กœ ์ด ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€ ์‚ฌ์šฉ์ž(์ด ๋ฌธ์ œ์˜ ๊ธฐ๋ก์œผ๋กœ ํŒ๋‹จ)์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ €๋ฅผ ์˜คํ•ดํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํŠœ๋ง ๋จธ์‹ ์—์„œ ํŒŒ์ƒ๋œ ๋ช…๋ นํ˜•/๋Œ์—ฐ๋ณ€์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์™„์ „ํžˆ ๋Œ€์ฒดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— JS ๋Ÿฐํƒ€์ž„์—์„œ ๊ธฐ๋Šฅ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ฝ”๋“œ๋Š” ๊ถ๊ทน์ ์œผ๋กœ ๋Œ์—ฐ๋ณ€์ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑ๋œ ์šด์˜ ์ฒด์ œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ณด๋‹ค ์ „ํ†ต์ ์ธ ๋ช…๋ นํ˜• ์Šคํƒ€์ผ(์•„๋งˆ๋„ C++์ด์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹˜)๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช…๋ นํ˜• ์•„์ด๋””์–ด(์•„๋งˆ๋„ C). ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณ ์ •๋œ ๋ฆฌ์†Œ์Šค์ด๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋Ÿฐํƒ€์ž„์ด ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ์ง“๋ง์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…๋ นํ˜• ๋ชจ๋ธ์€ ์ปดํ“จํŒ…์˜ ๊ธฐ๋ณธ์ด๋ฉฐ ์•ž์œผ๋กœ๋„ ๊ณ„์† ์œ ์ง€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ทธ ์œ„์— ๊ณต์กดํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด FP ์ฝ”๋“œ๊ฐ€ ๋•Œ๋•Œ๋กœ ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ๋“œ๋กญ๋‹ค์šด๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€ํ”ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์†์„ ๋“ค๊ณ  ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋งํ•˜๊ณ  ํ•จ์ˆ˜/๋ฆฌํ„ด์„ ์‚ฌ์šฉํ•˜์ž๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ => ํ•จ์ˆ˜ ๋Œ€์‹  function/return์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํŠน์ • ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด C๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. C์˜ FP๋Š” ํƒ€์ดํ•‘์„ ์กฐ๊ธˆ ๋” ํ•„์š”๋กœ ํ•˜๋ฉฐ ๊ฒฐ๊ตญ ๊ตฌ๋ฌธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.../s

ํ•˜๋ฃจ๊ฐ€ ๋๋‚˜๋ฉด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ๋Œ€์ค‘์ ์ธ ์–ธ์–ด๋กœ ๋žŒ๋‹ค ๋ฏธ์ ๋ถ„ํ•™ ๋ชจ๋ธ์—์„œ ์ž‘์—…ํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์— ์ ์  ๋” ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ž‘์ง€๋งŒ ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์•„์ง ์‹ค์งˆ์ ์ธ ํ•œ๊ณ„๊ฐ€ ๋งŽ์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹น๋ฉดํ•œ ์ฃผ์ œ๋„ ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“ . ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์ด์ œ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ ์†”๋ฃจ์…˜์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ, ๊ทธ ๋™์•ˆ์—๋Š” ๊ตฌ๋ฌธ์ด ์ค‘์š”ํ•œ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ์šฐ๋ฆฌ ์ž์‹ ์˜ ์˜๊ฒฌ์„ ๊ณ„์†ํ•ด์„œ ์„œ๋กœ ์„ค๋“ํ•˜๋Š” ๊ฒƒ์ด ํŠนํžˆ ์ƒ์‚ฐ์ ์ผ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™”์‚ดํ‘œ๋ฅผ ์ข‹์•„ํ•˜๊ณ  ๋‹น์‹ ์€ ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ๊ฒฌํ•ด๋ฅผ ๋ฐ”๊พธ๋Š” ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์„ ๋ณธ ์ ์ด ์—†๋‹ค. ๋‚˜๋Š” ํ•˜๋‚˜์— ์—ด๋ ค ์žˆ์ง€๋งŒ "๊ทธ๋ƒฅ ํ•จ์ˆ˜, wtf๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค"๋˜๋Š” "๋” ์ž์„ธํ•œ _syntax_๋กœ fp๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ๋ฌด๋ฆŽ ๊ฟ‡๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ์•„๋ฌด๋„ when ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๊ฐ€ ๋งํ–ˆ๋‹ค. :-)

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์†์„ ๋“ค๊ณ  ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋งํ•˜๊ณ  ํ•จ์ˆ˜/๋ฆฌํ„ด์„ ์‚ฌ์šฉํ•˜์ž๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™”์‚ดํ‘œ๋ฅผ ์ข‹์•„ํ•˜๊ณ  ๋‹น์‹ ์€ ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

... "๋” ์ž์„ธํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ fp๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ์—‰๋šฑํ•œ ์ƒ๊ฐ๋ณด๋‹ค ๋” ์‹ ์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ this ์‚ฌ์šฉํ•˜๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ์—๋Š” FP๊ฐ€ ์•„๋‹ˆ๋ผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜( ์ „ํ†ต์ ์ธ JS ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” FP์˜ ์—ญํ•จ์ˆ˜). ๋‹ค์‹œ ๋งํ•ด์„œ, ๋‹จ์ง€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋ฌธ์ œ๋Š” ๊ตฌ๋ฌธ ๋น„ํ˜ธํ™˜์„ฑ๋ณด๋‹ค ๋” ๊นŠ์€ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋น„ํ˜ธํ™˜์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(Mocha๋Š” ํ˜„์žฌ ์–ด์จŒ๋“  ์„ค๊ณ„๋˜์—ˆ์œผ๋ฏ€๋กœ).

this ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ชจ๋‘ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด Mocha ์œ„์— ๋Œ€์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์—์„œ FP๊ฐ€ ๋˜๋ ค๋ฉด Mocha์˜ this ๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ๋งŽ์€ ์ผ์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋„์ „์— ๋Œ€ํ•ด ๋งค์šฐ ๊ณ ๋ฌด์ 

(์ƒํƒœ ์ €์žฅ(stateful), ๊ธ€๋กœ๋ฒŒ(global), ๋˜๋Š” ๋” ๋‚˜์œ - ๋‘˜ ๋‹ค์ธ Mocha์˜ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋™์ž‘๋„ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐ„๋‹จํžˆ ๋‚˜์—ดํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Mocha๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.)

ํ˜„์žฌ this.timeout ์™ธ์— ํ…Œ์ŠคํŠธ๋ณ„๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ ๊ตฌ์„ฑ ์„ค์ •์˜ ํ‚ค-๊ฐ’ ๋งต(JS ๊ฐ์ฒด)์ด ๋  it ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•˜๋ผ๋Š” ์ œ์•ˆ์€ ๋ˆ„๊ตฐ๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ Mocha์—์„œ ๊ดœ์ฐฎ์€ ๋ฏธ๋ž˜ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•ด๋ณด์‹ญ์‹œ์˜ค.

ํ˜„์žฌ this.timeout ์™ธ์— ํ…Œ์ŠคํŠธ๋ณ„๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํ™•์ธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฃผ์žฅํ•œ ์š”์ ์„ ํ™•๊ณ ํžˆ ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ตฌํ˜„์„ ์‹œ๋„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ตฌ์„ฑ ์„ค์ •์˜ ํ‚ค-๊ฐ’ ๋งต(JS ๊ฐœ์ฒด๋กœ)์ด ๋  ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•˜๋ผ๋Š” ์ œ์•ˆ์€ Mocha์˜ ๊ดœ์ฐฎ์€ ๋ฏธ๋ž˜ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. this ๋ฅผ done ์ฝœ๋ฐฑ๊ณผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ this ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋จ). ๊ทธ๋Ÿฐ ๋‹ค์Œ mocha๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜(์˜ค๋Š˜๋‚  ์ž‘๋™ ๋ฐฉ์‹์—์„œ ์ถœ๋ฐœ)์— ๊ด€๊ณ„์—†์ด ์•ฝ์†์œผ๋กœ ๋ž˜ํ•‘๋œ ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ๋‘ ๊ฐœ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•ฝ์†์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ done ํ˜ธ์ถœํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋Œ€์‹  ์•ฝ์†์ด๋ฉด ํ•ด๊ฒฐ(๋˜๋Š” ๊ฑฐ๋ถ€)๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค(์ด์ „๊ณผ ๋™์ผ). ํ…Œ์ŠคํŠธ๊ฐ€ done ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ. ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ™•์ธ ์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ, ์ด ๊ฒฝ์šฐ mocha๋Š” ์•ฝ์†์„ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๋ชจํ˜ธํ•œ ์™„๋ฃŒ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” done์€ ํ•ด๊ฒฐ ํ›„ ์–ธ์  ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ, ์ด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์†Œ๊ธ‰์ ์œผ๋กœ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ด‘๋ฒ”์œ„ํ•œ ํš์„ ๊ทธ๋ ธ์ง€๋งŒ, ๋ชจ์นด๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ•˜๊ณ  ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œ ์™ธ๋ถ€์ธ์˜ ์ดํ•ด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์—์„œ FP๋กœ ๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด Mocha์˜ this๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ ์ด์ƒ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณ„์‚ฐ ๋ชจ๋ธ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ์—๋Š” ํ™•์‹คํ•œ ๋ณ€ํ™”๊ฐ€ ์žˆ์œผ๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋งŽ์€ ๋ณต์žกํ•œ ์ƒํƒœ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋•Œ๋•Œ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ(์˜ˆ: ๊ณ ์ • ๊ธฐ๋ณธ๊ฐ’ ๋Œ€์‹  ์ผ๋ถ€ ๊ณ„์‚ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ์ •ํ™•ํ•จ)์€ Mocha๋กœ FP ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์œ ์ผํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(์ง€๊ธˆ๊นŒ์ง€ ์ ์–ด๋„). ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. :+1:

์ฆ‰, Mocha์™€ ํŠน๋ณ„ํžˆ ๊ด€๋ จ๋œ ์ž„๋ฐ•ํ•œ ์žฅ์• ๋ฌผ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(FP์—์„œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋จ).

๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ๊ณผ๋Š” ๊ฑฐ์˜ ๋ฐ˜๋Œ€์ด์ง€๋งŒ

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

(์ˆœ์„œ๋Œ€๋กœ ์ธ์šฉํ•˜๊ณ  ๋Œ€๋‹ตํ–ˆ์ง€๋งŒ, ํ‹€๋ฆผ์—†์ด ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋” ์ด๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋” ๋Šฆ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)


๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ done ์ฝœ๋ฐฑ๊ณผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค). ๊ทธ๋ ‡๋‹ค๋ฉด... ์ด๊ฒƒ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ๋˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ณ ๋ ค ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋ฉด ๋” ๊ฐ„๋‹จํ•œ ๋””์ž์ธ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค๋ฉด ์ด ๋‘ ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‘ ํ†ต๊ณผํ•ด์•ผ ํ•˜๊ณ  ํƒ€์ž„์•„์›ƒ์ด ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

it("runs immediately", () => {
  // call functions and assert whatever
})
it("runs asynchronously", doneWithSomeOtherName => {
  setTimeout(() => {
    // call functions and assert whatever
    doneWithSomeOtherName()
  }, 100)
})

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค(๋น„๋ก ์ด ์ฃผ์„ ๋์— ์žˆ๋Š” ์ œ์•ˆ์— ์ค‘์ ์„ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๋””์ž์ธ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

it("looks just like an asynchronous test with a different name for `done`, but never tells Mocha it's done", context => {
  context.configureByMutation("some value")
  // call functions and assert whatever
})

๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ๊ฑฐ๊ธฐ์— ๋Œ์—ฐ๋ณ€์ด๊ฐ€ ์žˆ์Œ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ํ™•์ธํ•˜์„ธ์š”.


๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋•Œ๋•Œ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ(์˜ˆ: ๊ณ ์ • ๊ธฐ๋ณธ๊ฐ’ ๋Œ€์‹  ์ผ๋ถ€ ๊ณ„์‚ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ์ •ํ™•ํ•จ)์€ Mocha๋กœ FP ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์œ ์ผํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค(์ง€๊ธˆ๊นŒ์ง€ ์ ์–ด๋„). ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.

:+1:!


์ฆ‰, Mocha์™€ ํŠน๋ณ„ํžˆ ๊ด€๋ จ๋œ ์ž„๋ฐ•ํ•œ ์žฅ์• ๋ฌผ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(FP์—์„œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋จ).

๋‚ด๊ฐ€ ์ด ์ดˆ์ ์„ ์ •ํ™•ํžˆ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ๋” ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ ๋Œ€์ ์ธ ๊ฒƒ์œผ๋กœ ์—ฌ๊ฒจ์ง„๋‹ค๋ฉด ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์˜๋„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋งˆ์Œ๊ฐ€์ง์„ ๋ฐ”๊พธ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๋‹ค๋Š” ์ ์„ ์ธ์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.) Mocha์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์™€ getter ๋ฐ setter ์Šคํƒ€์ผ์˜ ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. "๊ฐ์ฒด ์ง€ํ–ฅ"(๊ทธ๋ฆฌ๊ณ  Mocha์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ ๋˜๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)๊ฐ€ ์žˆ์ง€๋งŒ, ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  Mocha๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ „๋ถ€์ธ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . Mocha์˜ ๋ช…๋ นํ˜• ๋ณ€๊ฒฝ ๊ตฌ์„ฑ์œผ๋กœ ์ด์ƒํ•œ ์ผ์„ ํ•  ์ˆ˜

it("imperatively sets the timeout multiple times", function(done) {
  this.timeout(5000)
  var context = this
  setTimeout(function() {
    context.timeout(1000)
    setTimeout(done, 500)
  }, 4000)
})

...ํ•˜์ง€๋งŒ ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ ์ด์ง€ ์•Š์€ ์–ธ์–ด์—์„œ ๊ธฐ๋Šฅ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๋งŽ์€ ์š”์†Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ช…๋ น์ ์ธ ๋‚ด์šฉ์„ ๋‚จ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

(์˜ˆ์™ธ๊ฐ€ ๋ถˆ์ˆœํ•˜๋‹ค๋Š” ์ฃผ์žฅ๋„ ์žˆ์ง€๋งŒ ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ throw๋˜๋Š” ์˜ˆ์™ธ๊ฐ€ ์‚ฌ์‹ค์ธ์ง€ ์•„์ง ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์ถœ๋ ฅ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ถ€๋Š” ์ฃผ์žฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ throw๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์‹œ์ ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

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

๋‚˜๋Š” ์•„๋งˆ ์ด ์ ‘์„ ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๊ฐ€์ง€ ๋ง์•˜์–ด์•ผ ํ–ˆ๋‹ค. ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๐Ÿ˜ธ


๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์˜ ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ๊ท€ํ•˜์˜ ์ž…์žฅ์—์„œ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

(์—ฌ๊ธฐ์—์„œ๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค:) ์‚ฌ์‹ค ์ €๋Š” timeout ๋ฅผ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๋Œ€์‹  ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋น„ํŠธ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค! Mocha์˜ ๋‚˜๋จธ์ง€ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด(๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์ œ ๊ธฐ์–ต์ด ๋งž๋‹ค๋ฉด ๋™๊ธฐ ํ…Œ์ŠคํŠธ์— ์ ์šฉ๋˜๋ฏ€๋กœ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?) ์˜ ์†์„ฑ done ๋ฐํ•˜์ž ์‚ฌ๋žŒ๋“ค์€ ํ†ตํ•ด ๊ตฌ์„ฑ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ์“ฐ๊ธฐ done ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์„ ๊ฒƒ,ํ•˜์ง€๋งŒ ๋‚œ์˜ ํƒˆ์„ ์„). ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์‹ฌ์ง€์–ด๋กœ ๊ตฌํ˜„ ์ฑ„ํƒ ํ•  ์ˆ˜์žˆ์„ it ์–ด์ฉŒ๋ฉด, ๊ทธ๋Ÿฐ ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜ (๋˜๋Š” ๋ญ”๊ฐ€๋ฅผ ํ†ต๊ณผ ํ•  ๋•Œ it.configured ๋˜๋Š” it(...).configured(...) ์šฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์€ ์ˆ˜-์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํ—›์†Œ๋ฆฌ ...)ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด - ๋‚˜๋Š” ํƒœํด ๊ธฐ๋ณธ ๋Œ์—ฐ๋ณ€์ด / ํ•„์ˆ˜ ๋ฌผ์งˆ๊ณผ๋Š” "๊ธฐ๋Šฅ ์ง€์› ํ™”์‚ดํ‘œ ๊ถŒ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ ๋ฐฉ๋ฒ•"(๋‚ด๊ฐ€ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์–ด์จŒ๋“  ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค): ์ƒˆ๋กœ์šด ํ–‰๋™์— ์ ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์—์„œ this ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ถ€๋ถ„์„ ํ™•์žฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

describe('a slow thing', () => {
 // test code...
}).timeout(5000);

์ œ๊ณต๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ณ„์•ฝ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ทธ๋Ÿฐ ๊ฒƒ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ƒ์ƒํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@thom-nic ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๋ชจ์นด์˜ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

return this;

ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ ํ˜•์‹์„ ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฐ”๊ฟ€ ๋•Œ ๋‚˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ() { ..... }

์•ˆ๋…• ์—ฌ๋Ÿฌ๋ถ„. 8์›”์— ๋‹ค์‹œ ํ† ๋ก ์„ ์ด‰๋ฐœํ•œ ํ›„ ์–ด๋‘์›Œ์ง„ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” ๊ฝค ๋ฐ”๋นด๊ณ  ์‹ค์ œ๋กœ ๊ทธ ์ž‘์—…์—์„œ ๋Œ€๋ถ€๋ถ„ ์™„๋ฃŒ/์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฝ์€ ๊ฒƒ ์ค‘ mocha๊ฐ€ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์„ค์ •์„ ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๊ทธ๋ž˜์„œ ๋Œ€์‹  ์šฐ๋ฆฌ๋Š” ์ž ์žฌ์ ์œผ๋กœ ์ง€์›๋˜๋Š” ์ž…๋ ฅ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์žฅํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” Promise ์ถ”์ƒํ™”๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค), ๊ทธ๋ž˜์„œ ์ด ์ผ๋ฐ˜ํ™”๋œ ํ…Œ์ŠคํŠธ ์ ˆ์ฐจ ํ•จ์ˆ˜๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ promise.then ์ฒด์ธ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋นต๊ณผ ๋ฒ„ํ„ฐ es6 ์ข…๋ฅ˜์˜ ๋ฌผ๊ฑด, ์ง€๊ธˆ๊นŒ์ง€ ๋„ˆ๋ฌด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด์ œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ์ ˆ์ฐจ ํ•จ์ˆ˜์— ๋‹ด์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํšจ๊ณผ์ ์œผ๋กœ ์ž…๋ ฅ์„ ์ •์˜ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด _seems_ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

it('does something', function() {
  testProcedureFunction('something','1')
})

์ž˜ ๋”ฐ๋ผ์˜ค์…จ๋‹ค๋ฉด ์ด ์˜ˆ์ œ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ๋ˆˆ์น˜์ฑ„์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. return ์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ๊ณ  testProcedureFunction์€ ์•ฝ์†(๋ง์žฅ๋‚œ ์˜๋„)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋์— ์žˆ๋Š” ์ฃผ์žฅ์ด ํ†ต๊ณผํ•˜๋“  ์‹คํŒจํ•˜๋“  ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ํ†ต๊ณผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒ„๊ทธ์ด๋ฉฐ ๋•Œ๋•Œ๋กœ ์ถ”์ ํ•˜๊ธฐ์—๋Š” ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด testProcedureFunction์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์‹œ์ž‘ ์‹œ ๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ  ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ ์ฃผ์žฅ ๋Œ€์‹  ํญ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ.

๋ฌผ๋ก  ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

it('does something', function() {
  return testProcedureFunction('something','1')
})

์ด์ œ ์ด ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•œ ์ค„์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ž…๋ ฅ์ด ๋” ํฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” ํ•œ ์ค„์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ณ ์ „์ ์ธ js ํ•จ์ˆ˜์™€ ํ™”์‚ดํ‘œ์˜ ์ฐจ์ด์  ์ค‘ ์—ฌ๊ธฐ์—์„œ ์œ ์šฉํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ํŠน์ • ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ช…๋ น๋ฌธ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ค‘๊ด„ํ˜ธ๊ฐ€ ์ƒ๋žต๋  ๋•Œ ์•”์‹œ์ ์ธ ๋ฐ˜ํ™˜์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. function {...} ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ํ…Œ์ŠคํŠธ์—์„œ => ... ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ™”์‚ดํ‘œ์™€ ์ค‘๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์‰ฝ๊ฒŒ ์Šค์บ”ํ•˜๊ณ  ์ด ๋ˆ„๋ฝ๋œ return ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ๋น ๋ฅด๊ฒŒ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ:

it('does something', () => testProcedureFunction('something','1'))

์ด์ œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ณด๋‹ค ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”! ๋ฌผ๋ก  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

it('does something slow', function() {
  this.timeout(10000)
  return testProcedureFunction('somethingSlow','2')
})

์•„๋‹ˆ๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ•ด์„œ ๋จผ์ € ์ด๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค):

it('does something slow', () => {
  this.timeout(10000)
  return testProcedureFunction('somethingSlow','2')
})

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‹œ์ž‘ํ–ˆ๋˜ ๊ณณ์œผ๋กœ ๋Œ์•„์™”์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ๋ฐ˜๋ณตํ•˜๊ธฐ์— ๋ฌด๋ฅด์ต์€ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ˆ„๋ฝ๋œ ๋ฐ˜ํ™˜ ๋ฒ„๊ทธ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค(๋ฏธ๋ž˜์˜ ๋‚˜ ๋˜๋Š” ๋‹ค์Œ ์‚ฌ๋žŒ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ ์€ ์‹ค์ˆ˜ํ•˜๋ฉด ๋ˆˆ์— ๋„์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) when ํ•จ์ˆ˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ™”์‚ดํ‘œ๋ฅผ ๋‹ค์‹œ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

it('does something slow', when(() => testProcedureFunction('somethingSlow','2'), 10000))

(์ฐธ๊ณ ๋กœ ์œ„์˜ .timeout(5000) ๋„ํŠธ ์ฒด์ธ ์ œ์•ˆ์„ ์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋˜ ๋ชจ์นด ๋ฒ„์ „ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋ ฅํ•˜๋‹ค!)
(์ฐธ๊ณ  2, when ์‚ฌ์šฉ์€ this ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ… ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์‹ค์ œ๋กœ๋Š” ๋‚˜์ค‘์— ์ƒ๊ฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋ˆ„๋ฝ๋œ ์•ฝ์†์— ๋Œ€ํ•œ ์ˆ˜์ต ๋ฒ„๊ทธ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฐํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ๋” ํ˜„์‹ค์ ์œผ๋กœ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์— ๋Œ€ํ•ด rhs๋กœ return ๋ฌธ์„ ์ ์šฉ). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋‹น์‹œ ์˜ต์…˜์ด ์•„๋‹ˆ์—ˆ๋‹ค ํ”Œ๋Ÿฌ์Šค (์ฃผ๊ด€์  / ๊ฐœ์ธ์ ์œผ๋กœ) ์‰ฝ๊ฒŒ ์ฝ์„ ๋ฉ€๋ฆฌ์—์„œ ๋‚˜๋ฅผ ์œ„ํ•ด ๋น„๋Š˜์„ ๋ฐ€๊ณ ์™€ ์ž‘์—…, ๋‚˜๋Š” ํ™”์‚ดํ‘œ ๊ตฌ๋ฌธ์€ ์งง์€ ๋‚˜์˜ค๋Š” ์ƒ๊ฐํ•˜๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ function .

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๋งŒ๊ฐ„ ๋‹ค์‹œ ๋‹ต์žฅ์„ ๋ณด๋‚ผ ์‹œ๊ฐ„์ด ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ตœ์†Œํ•œ ์ •๋ณด๊ฐ€ ์žˆ๊ณ  ๋ช…ํ™•ํ–ˆ์œผ๋ฉด ํ•˜๋ฉฐ "ํ™”์‚ดํ‘œ์—์„œ ๋ชจ์นด ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค" ํ•ญ๋ชฉ์„ ๋‘˜๋Ÿฌ์‹ผ ๋…ผ์Ÿ์„ ์นจ๋Œ€.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚˜๋Š” function vs => ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ธฐ ๋•Œ๋ฌธ์—, ์™œ ํ™”์‚ดํ‘œ๊ฐ€ this ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š”์ง€ ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์ฝ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด ๋งํฌ๋ฅผ ์‚ญ์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ๊ธฐ๋Šฅ ๋Œ€ ํ™”์‚ดํ‘œ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๋ช…ํ™•ํ•œ ์„ค๋ช…์ด์—ˆ๊ณ  ๋งˆ์นจ๋‚ด ์™„์ „ํžˆ ์ž์‹ ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

https://hacks.mozilla.org/2015/06/es6-in-depth-arrow-functions/

@thom-nic it ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ describe ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

describe('my test suite', () => {

  it('test case 1', () => {
    // ...
  }).timeout('10s');  // Works on `it`. This test case doesn't timeout

  it('test case 2', () => {
    // ...
  });  // This test case timeouts.

}).timeout('10s');  // Doesn't work on `describe`. Tests are already created when runs to here.

@thom-nic, ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

describe('my test suite', function() {
this.timeout(n);

...
}

์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ์€ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ๋ฉ‹์ง„ ES6์ด ์•„๋‹ˆ๋ผ ๊ณ ์ „์ ์ธ function () {} ๋ฅผ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ์œ ์ผํ•œ ๋ชฉ์ ์€ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ this ๋ฅผ ์ƒ์†ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ณ ์ „์ ์ธ function () ์—๋Š” ์ž์ฒด this ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ „์ฒด ES6 ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ•จ์ˆ˜์˜ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ this ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ function () ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์— ๋”ฐ๋ผ ES6 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ function () ๋ฐ () => ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

this.timeout() ๋Š” it('....', () => { ... }) ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์ด this ์ƒ์œ„ describe() ํ•จ์ˆ˜์—์„œ this ๋ฅผ ์ƒ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ this.timeout() ๋Š” ๊ทธ ์ˆ˜์ค€์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ถœ์—์„œ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜์— ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

(param)=>aํ•จ์ˆ˜
...๊ทธ๋•Œ(aFunction)

function(){}์€ 'this'์— ๋ฐ”์ธ๋”ฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ()=>๋Š” '๊ณ ์ •'๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ˆ˜์‹ ์ž๊ฐ€ ํ˜ธ์ถœ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฏธ๋ฆฌ ๊ฒฐ์ •๋œ 'this'๋ฅผ ์˜ˆ์ƒ ํ•  ๋•Œ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋Œ€์ฒด ํ•ด์•ผ ํ•˜๋ฉฐ(๋˜ํ•œ ์ ์€ ์ฝ”๋“œ ์ž…๋ ฅ์˜ ์ด์ ๋„ ์žˆ์Œ)

'์ด๊ฒƒ'์„ ํ˜ธ์ถœํ•  ๋•Œ '์ด๊ฒƒ'์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฒฐ์ฝ” function()์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ํ”Œ๋ผ๋ฉฉ์ฝ”...

๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ถœ์—์„œ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜์— ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์„ _์ •ํ™•ํžˆ_ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
"ํ•จ์ˆ˜์— ์ธ์ˆ˜ ๋ณด๋‚ด๊ธฐ"์— ๊ด€ํ•œ ํ•œ, ๊ตต์€ ํ™”์‚ดํ‘œ๋Š” ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ 1๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

() => console.log("hi"); //zero arguments requires empty parenthesis
a => console.log(a); //you can optionally leave the parenthesis off for 1 argument
(a,b) => console.log(`${a} ${b}`); //2..n arguments requires parenthesis

ํ•จ์ˆ˜๊ฐ€ ๋‹จ์ผ ํ‘œํ˜„์‹์ธ ํ•œ ๊ตต์€ ํ™”์‚ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๊ด„ํ˜ธ์™€ return ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜์—ฌ ๊ฐ’์„ _๋ฐ˜ํ™˜_ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‹น์‹ ์ด ์žˆ์—ˆ๋‹ค๋ฉด ...

setTimeout(function(a,b) { doSomething(); return calculateSomething(a,b); }, 5000);

...๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ๋šฑ๋šฑํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฌธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ด„ํ˜ธ์™€ return ํ‚ค์›Œ๋“œ๋ฅผ ํ”๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค...

setTimeout((a,b) => { doSomething(); return calculateSomething(a,b); }, 5000);

์ฐจ๋ผ๋ฆฌ ์‹œ์ž‘ํ–ˆ๋‹ค๋ฉด...

setTimeout(function(a,b) { return calculateSomething(a,b); }, 5000);

...๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ด์„œ ๋‹จ์ผ ํ‘œํ˜„์‹์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...

setTimeout((a,b) => calculateSomething(a,b), 5000);

์ฝ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค!
codefoster.com/levelup-arrays ์—์„œ

JavaScript์—๋Š” OOP์—์„œ FP๊นŒ์ง€, ์—„๊ฒฉํ•œ ์œ ํ˜• ์•ˆ์ „์„ฑ์—์„œ mixin/duck-typing์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ์Šคํƒ€์ผ์—๋Š” ๊ณ ๊ธ‰ ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: OOP ์บ ํ”„์˜ ์ข…์†์„ฑ ์ฃผ์ž…, FP ์บ ํ”„์˜ ์ปค๋ง/๋ชจ๋‚˜๋“œ).

์–ด๋”” ์ฝ”๋”ฉ ์Šคํƒ€์ผ์€ ๊ฐ€๊นŒ์šด FPํ•˜๋Š” ๊ฒฝ์šฐ this ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ํ™”์‚ดํ‘œ๋˜์ง€ ์•Š๊ณ  ๋ณด์กดํ•˜๋Š” ๋ฐ, ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” this (์˜ˆ : ์ƒ์„ฑ, ํ…Œ์ŠคํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ์–ด๋–ค ๊ณ ๊ธ‰ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์˜ค๋ฒ„ ํ—ค๋“œ DSL).

์ˆ™๋ จ๋œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ž์‹ ์˜ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์— ๋งž๊ฒŒ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ "์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ" ์ˆ˜์ค€์ด ์•„๋‹˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์—…๊ทธ๋ ˆ์ด๋“œ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฑ„ํƒ, ์ƒˆ ์—”์ง€๋‹ˆ์–ด ์˜จ๋ณด๋”ฉ์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

this ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  describe , it ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ปจํ…์ŠคํŠธ ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์ฒด bdd ์ธํ„ฐํŽ˜์ด์Šค ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค this it ๋ฐ ํ›„ํฌ.

๊ทธ๋Ÿฌ๋‚˜ IIRC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์‹œ๋„๋ฅผ ๋ณด๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹ฌ๊ฐํ•œ ๋ถ€์ž‘์šฉ์— ๋น ์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ด์™€ ๊ฐ™์ด done-or-context ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

it("runs immediately", () => {
  // call functions and assert whatever
})
it("runs asynchronously", doneOrContext => {
  setTimeout(() => {
    // call functions and assert whatever
    doneOrContext();
  }, 100)
})



md5-b1fe6f00c87a2916712cf6a4df16e142



it("runs immediately using the parameter as a context", doneOrContext => {
  doneOrContext.configureByMutation("some value");
  // As well as changing config, also flags to Mocha that this test is treating the
  // parameter as a context object and is therefore not async.
  // Call functions and assert whatever
})



md5-b1fe6f00c87a2916712cf6a4df16e142



it("runs asynchronously using the parameter as a context", doneOrContext => {
  doneOrContext.configureByMutation("some value");
  doneOrContext.setAsync(); // Flags to Mocha that even though the parameter has been used as
  // a context object, the test is in fact asynchronous.
  setTimeout(() => {
    // call functions and assert whatever
    doneOrContext();
    // or doneOrContext.done()
  }, 100)
})

์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋™์ผํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ดˆ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ด์Šคํฌ๋ฆฝํŠธ:

describe("getBillingDetail", ๋น„๋™๊ธฐ ํ•จ์ˆ˜(){
this.timeout(55000);
it.only("์ง€์ •๋œ ์œ ํšจํ•œ ์ž‘์—… ์ด๋ฆ„ ํ™•์ธ", ๋น„๋™๊ธฐ ํ•จ์ˆ˜(์™„๋ฃŒ){
this.timeout(55000);
var ๊ฒฐ๊ณผ = ๋Œ€๊ธฐ url.getBillingDetail('12254785565647858');
console.log(๊ฒฐ๊ณผ);
assert.equal(๊ฒฐ๊ณผ, ์ฐธ);
});
});

์˜ค๋ฅ˜: 55000ms์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ๋ฐ ํ›„ํฌ์˜ ๊ฒฝ์šฐ "done()"์ด ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋น„๋™๊ธฐ ํ•จ์ˆ˜์— ์™„๋ฃŒ๋œ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž… ์†”๋ฃจ์…˜์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋ณ„๋„์˜ ๋ชจ๋“ˆ์ด์ง€๋งŒ ๊ธฐ๋Šฅ์„ ์ ์ ˆํ•œ mocha ์‰ฝ๊ฒŒ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/papercuptech/mocha-lambda

๋น ๋ฅธ ๊ธธ

require('mocha-lambda')
// now a global '_tst' can be used where 'this' was before

describe('suite', () => {
  beforeEach(() => {
    _tst.answer = 42
  })

  it('provides "this" as "_tst"', function() {
    assert(this === _tst)
  })

  it('works', () => {
    assert(_tst.answer === 42)
    _tst.skip()
  })
})

๋ช…์‹œ์  ์ด๋ฆ„ ์ง€์ •(TypeScript์™€ ํ•จ๊ป˜ ์ž‘๋™)

// if you were previously explicitly importing api (describe, it, etc.) from 'mocha',
// you will have to change to importing from 'mocha-lambda', until (or if) this
// gets merged into mocha proper
import ctx, {describe as d, it as i} from 'mocha-lambda'

d('suite', () => {
  // ctx() is a function that returns "this" as appropriate
  i('works using ctx()', () => {
    ctx().skip()
  })
})

import {Context} from 'mocha'
// ctx() can also rename global
ctx('t')
declare var t: Context
d('suite', () => {
  // ctx() is a function that returns "this" as appropriate
  i('works using renamed global', () => {
    t.skip()
  })
})

@papercuptech ๋งํฌ 404๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์›์Šค.. ๊ฐœ์ธ ์ €์žฅ์†Œ์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ณต๊ฐœ

npm i mocha-lambda๋„ ๊ฐ€๋Šฅ

@alung @linesh-simplicity, ์ด๊ฒƒ์€ #3485๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ "๋งˆ๋ฒ•"์ด ๊ฒฐ๊ตญ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋‚˜์š”? ์™œ ์•ˆ๋˜๋‚˜์š”?:

var mocha = require('mocha');

mocha.describe('foo', (suite) => {
  suite.timeout(100);

  suite.it('must love bar', () => ... );  
});

์ „์—ญ๋„ ์—†๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋งˆ๋ฒ•๋„ ์—†๊ณ ... JavaScript๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

@thom-nic ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜๊ณ  ์ฒญ์†Œํ•˜๊ณ  ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

describe('a slow thing', () => {
 // test code...
}).timeout(5000);

์ œ๊ณต๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ณ„์•ฝ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ทธ๋Ÿฐ ๊ฒƒ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ƒ์ƒํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@thom-nic ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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