๐ Chapter 11: ์๋๋ฐ์ค ํจํด
๐ ๋จ์ ํ ์คํธโ
์๊ตฌ์ฌํญ: ์ฝํผ๋ฐ์ค ํ์ฌ์ ์ ๋ฐ์ ์ธ ์งํ ์ํฉ๊ณผ ์น ์ฌ์ดํธ ์ด์ ์คํ๋ฅผ ํ๋์ ํ์ ํ ์ ์๋ ๋์๋ณด๋๊ฐ ์์์ผ๋ฉด ์ข๊ณ๋ค๊ณ ์ฃผ์ต ๋ด๋น์๋ ๋งํ๋ค.
ํญ๋ชฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฝํผ๋ฐ์ค ๋ฑ๋ก์ ์
- ์ฝ ํผ๋ฐ์ค ๋ฑ๋ก์ ์ฑ๋ช
- ์ฒดํฌ์ธํ ์ฐธ๊ฐ์ ์
- ์ฒดํฌ์ธํ ์ฐธ๊ฐ์ ์ฑ๋ช
- ์๋ํํฐ ์์ฅ API์ ํธ์ถ ํ์
- ์ง์ญ ๊ณตํญ ๊ธฐ์ ์๋ณด
๐ ์์ ฏ ์๋๋ฐ์ค ๋ง๋ค๊ธฐโ
์์ ฏ ์๋๋ฐ์ค์ ๋ชฉ์ ์ ๊ฐ ์์ ฏ์ ๋ถ๋ฆฌํ์ฌ ์์์ ์์ง์ด๊ฒ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์๋๋ฐ์ค ํจํด์ ์ด์ฉํ๋ฉด ์์ ฏ๋ง๋ค ํ์ ๋ ์์กด์ฑ ์ ๋ฌผ ์ธํธ๋ฅผ ์ฆ์ ํ์ฌ ๊ฐ์ ์๋ฌด๋ฅผ ์์ํ๋ ๋ฐ ํ์ํ ๋๊ตฌ๋ฅผ ๊ณต์ํ ์ ์๋ค.
์์ ฏ ์๋๋ฐ์ค๋ฅผ ์ธ์คํด์คํโ
WidgetSandbox
์์ฑ์ ํจ์๋ new
ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , ์ ์ด๋ ํ๋์ ์ธ์, ์ฆ ์๋๋ฐ์ค์ ๊ฒฉ๋ฆฌํ ์์ ฏ ์์ฑ ํจ์๋ฅผ ๋ฐ๋๋ก ์์ฑํ๋ค. ๋จผ์ , ๊ธฐ๋ฅ ์ ๊ฒ์ฉ ๋จ์ ํ
์คํธ๋ฅผ ๋ง๋ ๋ค.
describe('Conference.WidgetSandbox', () => {
'use strict';
describe('์์ฑ์ ํจ์', () => {
it('"new" ํค์๋๋ก ์คํํ์ง ์์ผ๋ฉด ์์ธ๋ฅผ ๋์ง๋ค', () => {
expect(function shouldThrow() {
var sandbox = Conference.WidgetSandbox();
}).toThrowError(Conference.WidgetSandbox.messages.mustBeCalledWithNew);
});
it('์์ ฏ ํจ์๊ฐ ๋๋ฝ๋๋ฉด ์์ธ๋ฅผ ๋์ง๋ค', () => {
[null, undefined, 1, 'SomeString', false].forEach(function testInvalid(notAFcn) {
expect(function shouldThrow() {
var sandbox = new Conference.WidgetSandbox(notAFcn);
}).toThrowError(Conference.WidgetSandbox.messages.fcnMustBeProvided);
});
});
it('sandbox๋ฅผ ์ธ์๋ก ์์ ฏ ํจ์๋ฅผ ์คํํ๋ค', () => {
var widgetFcn = jasmine.createSpy();
var sandbox = new Conference.WidgetSandbox(widgetFcn);
expect(widgetFcn).toHaveBeenCalledWith(sandbox);
});
});
});
WidgetSandbox
๊ตฌํ๋ถ๋ฅผ ์์ฑํ๋ค.
var Conference = Conference || {};
Conference.WidgetSandbox = function() {
'use strict';
// Conference.WidgetSandbox(...)๋ฅผ new๋ก ์คํํ๋์ง ๋ณด์ฅํ๋ค.
if (!(this instanceof Conference.WidgetSandbox)) {
throw new Error(Conference.WidgetSandbox.messages.mustBeCalledWithNew);
}
var widgetFunction = arguments[0];
if (typeof widgetFunction !== 'function') {
throw new Error(Conference.WidgetSandbox.messages.fcnMustBeProvided);
}
widgetFunction(this);
};
Conference.WidgetSandbox.messages = {
mustBeCalledWithNew: 'WidgetSandbox ํจ์๋ ๋ฐ๋์ new๋ก ํธ์ถํด์ผ ํฉ๋๋ค',
fcnMustBeProvided: '์์ ฏ ํจ์๋ ํ์ ์
๋ ฅ ํญ๋ชฉ์
๋๋ค',
};