๋ง์ ๋ ธ๋ ๋ชจ๋์ ๋จ์ผ ํจ์(์์ฑ์ ํจ์๊ฐ ์๋๋ผ ๋ฒ์ฉ "์ ํธ๋ฆฌํฐ" ํจ์)๋ฅผ "module.exports"๋ก ๋ด๋ณด๋ ๋๋ค. Sinon.js๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ ๋ฆฝํ ํจ์๋ฅผ ์คํ ํ ์ ์์ต๋๊น?
// some module, "sum.js" that's "required" throughout the application
module.exports = function(a, b) {
return a + b;
};
// test.js
var sum = require('sum');
...
beforeEach(function() {
sumStub = sinon.stub(sum);
// throws: TypeError: Attempted to wrap undefined property undefined as function
});
afterEach(function() {
sumStub.restore();
});
...
์ด๊ฒ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋ถํํ๋.
npm์ ๊ฒฝ์ฐ https://github.com/thlorenz/proxyquire ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Michael Feathers๋ ์ด๊ฒ์ ๋งํฌ ์๊ธฐ ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ฐ์ํ์ง๋ ์์ง๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ผ๋จ ๊ทธ ์๋ฆฌ์ ์์ผ๋ฉด ํ์์ฒ๋ผ Sinon์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฅ๊ธฐ์ ์ผ๋ก ์ํคํ ์ฒ๋ฅผ _๊ฐ์ฒด ์ด์์_๋ก ์ด๋ํ๊ณ ์ถ์ ์๋ ์์ง๋ง ์ค๋๋ ์๋ ์๋ํ๋ ์๋ฃจ์ ์ ๋๋ค. RequireJS์ ๋ํ ์ ์ฌํ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค.
function MyFunction(){}
module.exports = function(){ return module.exports.MyFunction.apply(this, arguments) }
module.exports.MyFunction = MyFunction
๊ทธ๋ฐ ๋ค์ require('./MyFunction').MyFunction์ ์คํ ํ ์ ์์ผ๋ฉฐ ๋๋จธ์ง ์ฝ๋๋ ๋ณ๊ฒฝ ์์ด ์คํ ๋ ๋ฒ์ ์ ๋ณผ ์ ์์ต๋๋ค.
: ํ๊ธฐ์ฆ: : ํ๊ธฐ์ฆ ๋๋ ์ผ๊ตด: : ํ๊ธฐ์ฆ:
์์ ๋ ๋๊ฐ์ ์ผ์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ฌ ๋ด๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const proxyquire = require('proxyquire')
const sinon = require('sinon')
const sum = sinon.stub()
const ModuleWithDependency = proxyquire('module', {
'sum': sum
})
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์ ๊ฝค ์ ์๋ํฉ๋๋ค.
CommonJS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
const myStubbedModule = function( absoluteModulePath ) {
const stub = sinon.stub();
require.cache[ require.resolve( absoluteModulePath ) ] = stub;
return stub;
}
_์ฐธ๊ณ _: ํธ๋์คํ์ผ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค์์ ์ํํด์ผ ํ ์๋ ์์ต๋๋ค.
require.cache[ require.resolve( absoluteModulePath ) ] = {
default: stub,
exports: stub
}
์ข ์ข ํ ์คํธ ์ค์ ํ๋์ ํน์ ํ ์คํธ์ ๋ํด ํ๋์ ์คํ ์ ์ฝ์ ํด์ผ ํฉ๋๋ค. ๋ด๊ฐ ์ทจํ ๋ํผ ํจ์ ์ ๊ทผ ๋ฐฉ์ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์์ ํ๊ณ ์ํ ๋๋ง๋ค ์คํ ์ ์ฝ์ ํ ์ ์์ต๋๋ค. ์คํ ์ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ๊ฑฐ๋ ๋ค๋ฅธ ๋ชจ๋์ ๋ํ ์ฐธ์กฐ๊ฐ ์๋ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋๋์ง ์ก๊ธฐ๋ฅผ ํ ํ์๊ฐ ์์ต๋๋ค. ์คํ ๋ฐ ์ ์๋ฆฌ ๊ต์ฒด.
๋๋ ์ฌ๋๋ค์ด proxyquire, mock-require , &c๋ฅผ ํตํด ๋ ธ๋ ๋ชจ๋ ๊ณ์ธต์์ ํดํน์ ํ๋๋ก ๋ฐ์ด๋ถ์ธ ์ฌ๋ฌ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ก์ต๋๋ค. ์์์ ๊ฐ๋จํ๊ณ ๋ ๊น๋ค๋ก์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์คํ ์ ์ป๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ค์ด ๋์ ์ด ๋ฉ๋๋ค. ํ ์คํธ ์ค์ ์ค์ ์ ์๋ฆฌ์ ํ์ํฉ๋๋ค. proxyquire๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ์ ๋ง์ดํฌ๋ก/ํฝ์ค์ฒ ํฌ๊ธฐ ๋ฒ์ , ์ต์์ ์์ค ๋ฐ ๋ชจ๋ ์คํ ์ด ๋ก๋๋๋ ๋์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ์ด๋ฅผ ๋ ธ๋ ๋ชจ๋ ์์ค์ด ์๋ JS ์ธ์ด ์์ค์์ ๊ณ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํจ์ฌ ๋ ๊ฐ๋จํ๊ณ ์ํํ์ง ์๊ณ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค(์ฃผ์ ์ฌํญ: ๋ณต์ํ๋ ๊ฒ์ ๊ธฐ์ตํ๋ ํ).
์ด ๋ชจ๋์ ๋ ์ฝ๊ฒ ์คํ ๋ชจ๋๋ก ๋ง๋ค์์ต๋๋ค. https://github.com/caiogondim/stubbable-decorator.js
๋๋ ๋ฐฉ๊ธ Sinon์ ๊ฐ์ง๊ณ ๋๊ณ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฐ๋จํ ์๋ฃจ์ ์ ์ฐพ์์ต๋๋ค. ๋ ๋ฒ์งธ ์ธ์๋ก '์ธ์'๋ฅผ ์ถ๊ฐํ์ญ์์ค.
const sumStub = sinon.stub(sum, 'arguments');
sumStub.withArgs(2, 2).returns(4);
sumStub.withArgs(3, 3).returns(6);
์ด ์๋
import * as sum from './sum'
sinon.stub(sum, 'default', () => {
// stubbed function
});
@harryi3t - ์ ๋ฅผ ์ํด ์ผํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@harryi3t ES ๋ชจ๋์ ์ฌ์ฉํ๋ ์ ์๊ฒ๋ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
์ค๋ฅ: can't redefine non-configurable property "default"
@elliottregan ES ๋ชจ๋์ STANDARD์ ๋ฐ๋ผ ์คํ ํ ์ ์์ต๋๋ค. ์ด ๋์์ ์ฌ๊ธฐ์์ ๋ ผ์ํ๋ ๊ฒ์ฒ๋ผ ์ฌ์ ํ ํ ์ ์์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ค์ ๋ก ES ๋ชจ๋์ ํ
์คํธํ์ง ์๊ณ (Webpack/Babel ๋ฑ์ ์ฌ์ฉํ์ฌ) ES ๋ชจ๋์ ํธ๋์คํ์ผํ์ต๋๋ค. ๊ฒฐ๊ณผ ES5๋ ๊ฒํฐ๋ฅผ ์ฌ์ฉํ์ฌ ES ๋ชจ๋์ด ์๋ํ๋ ๋ฐฉ์์ ์๋ฎฌ๋ ์ดํธํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ ์๋ ์์ง๋ง ์ฐ๊ฒฐ๋ ์ค๋ ๋์์ ์ ์ํ ๊ฐ๋จํ ๊ฒฝ๋ก๋ฅผ ์๋ํ์ญ์์ค. mocha --register ...
์(๋) ๋จผ ๊ธธ์ ์๋ดํฉ๋๋ค.
๊ฐ๋ฅํ ํด๊ฒฐ ๋ฐฉ๋ฒ
(function (defineProperty) {
Object.defineProperty = (obj, prop, desc) => {
desc.configurable = true;
return defineProperty(obj, prop, desc);
};
})(Object.defineProperty);
@Sujimoshi ์ ํํ ๋ฌด์์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ? ๋น์ ์ ์์ ์ ๋ํ ์ปจํ ์คํธ๋ ๋ฌด์์ ๋๊น? ๋ํ ์ฌ๋๋ค์ ์์ ์ฌํญ์ ์ด๋์ ๋๊ฒ ์ต๋๊น? ํ์ฌ์ ํ์ ์์๋ ๋์์ด ๋๊ธฐ์ ์ ๋ณด๊ฐ ๋๋ฌด ๋ง์ด ๋น ์ ธ ์์ต๋๋ค. ์๋ ์ง๋ฌธ์ ๋์์ด๋์ง ์์ผ๋ฉฐ ES Modules์์ ์๋ํ์ง ์์ต๋๋ค. Webpack 4์์ ์ฒ๋ฆฌ๋ ์ฝ๋์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. (๋๊ตฌ ์ฒด์ธ์ ๋ฐ๋ผ ๋ค๋ฆ) ES5๋ก _transpiled_๋ ES2015+ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ฝ๋์ ์ ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. .
์ด ์๋
import * as sum from './sum' sinon.stub(sum, 'default', () => { // stubbed function });
์ง๊ธ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
๋ฐฉ๊ธ ES6 ๋ชจ๋์ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์์ฑํ์ต๋๋ค.
export default const doCoolStuff = () => {
// do the cool stuff...
}
์ด์:
export default {
doCoolStuff: () => {
// do the cool stuff...
}
}
์ฝ๊ฐ ํฌ๋ฐํ์ง๋ง ์คํ ์์ ํจ์๋ฅผ ๋ํํ ์ ์์ต๋๋ค.
์ง๊ธ์ด ๊ฑฐ์ 2021๋ ์ธ๋ฐ ๊ฐ๋ฅํ ๊น์?
์ง๊ธ์ด ๊ฑฐ์ 2021๋ ์ธ๋ฐ ๊ฐ๋ฅํ ๊น์?
2019๋
๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
ES ๋ชจ๋์ด ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฉฐ CommonJS๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฉฐ JavaScript๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์๋