ํ์ดํ ํจ์์ ๋ํด "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
๋ชจ์นด๋ ์ด๋ค ์ถ์
ํ ์์์๋ฅผ ์ฌ์ฉํฉ๋๊น?
ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ํํ ์ ์๋ ํ ์คํธ ์ปจํ ์คํธ์ ํจ์๋ฅผ ๋ฐ์ธ๋ฉํฉ๋๋ค. http://mochajs.org/์์
๋ฏธ์ํฉ๋๋ค!
๊ฐ์ฌ ํด์.
์ ๊ทธ๋ ๊ฒ ๋ง์ "๋ง๋ฒ"์ด ๊ฒฐ๊ตญ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋์? ์ ์๋๋์?:
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()
})
})
// 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 ์๋ฃจ์ ์ด ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ฐ์ฌ ํด์.
์ ๊ทธ๋ ๊ฒ ๋ง์ "๋ง๋ฒ"์ด ๊ฒฐ๊ตญ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋์? ์ ์๋๋์?:
์ ์ญ๋ ์๊ณ ๋ฌธ์ ๊ฐ ์๋ ๋ง๋ฒ๋ ์๊ณ ... JavaScript๋ง ์์ต๋๋ค.