์คํ์ด (๊ฐ์ฒด ์์ฑ ์ ์ธ)๊ฐ ์ด๋ฆ์ผ๋ก ์์ฑ ๋ ์ ์๋ค๋ฉด ์ด์ค ์ ์ค๋ฅ ๋ฉ์์ง์ ๊ฐ๋ ์ฑ์ ๋์์ด๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ค๋ฏผ ์คํ์ด๋ ์ด๊ฒ์ ํ์ฉํฉ๋๋ค.
Sinon์ ๋ํ ๋ ํจ์ ์ด๋ฆ์ ๊ฒ์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ๋น ๋ช ๋ช ๋ ํจ์๋ฅผ ๋ํํ์ฌ ์คํ์ด์ ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค.
var spy = sinon.spy(function doStuff() {});
์ด ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ํน์ ๊ธธ์ด์ ํจ์๋ฅผ ์์ฑ ํ ์๋ ์์ต๋๋ค.
var spy = sinon.spy(function doStuff(a, b, c) {}); // spy.length === 3
๋ด๊ฐ ๋ณผ ์์๋ ํ ํญ์ ํจ์ ์ด๋ฆ์ผ๋ก "ํ๋ก์"์ ๋๋ค. ์ด ์๊ฒฌ์ด ์ฌ์ค์ ๋๊น?
๋ด๊ฐ ๋ณผ ์์๋ ํ ํญ์ ํจ์ ์ด๋ฆ์ผ๋ก "ํ๋ก์"์ ๋๋ค. ์ด ์๊ฒฌ์ด ์ฌ์ค์ ๋๊น?
์คํ ๊ฐ๋ฅํ ์์ ๋ฅผ ๊ฒ์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
// test/index.js
var sinon = require('sinon');
var spy = sinon.spy(function doStuff() {
console.log('Name: ' + spy.name);
});
spy();
โ sinon-test node test/index.js
Name: proxy
์ด์ ์ ๋ฌด์์ํ๋์ง ๊ธฐ์ต์ด ๋์ง ์์ง๋ง ํจ์ ์ด๋ฆ์ด "proxy"์ธ ํ ์คํธ ์คํจ์์ Mocha ์ถ๋ ฅ์ ์ป์์ผ๋ฉฐ "doStuff"๋ผ๋ ๊ฒ์ ๋ชจ๋ฅผ ๊ฒ์ ๋๋ค. ์ ํํ ๋ฌด์์ด ์๋์ง ๊ธฐ์ตํ ์ ์๋ค๋ฉด ๊ฒ์ํ๊ฒ ์ต๋๋ค.
๋๋ ์ด๊ฒ์๋ณด๊ณ ์๋ค; ํญ์ ์ด๋ฆ์ด proxy
๋ผ๊ณ ํ์๋์ด ์์ง๋ง Object.defineProperty(spy, 'name', { value: 'new name' })
์ด๋ฉด "new name"์๋ณด๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ๋ค์ ์ด๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ค์์ ํตํด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
const mapMethod = sinon.spy(Array.prototype, 'map');
const methodName = map.wrappedMethod.name;
console.log(methodName); // 'map'
ํ ์คํธ๊ฐ ์๋ ์ฝ๋๊ฐ ํจ์ ์ด๋ฆ์ ์์กด ํ ๋ ์๋ํ์ง ์๋ @Tbhesswebber .
์ ... ์ข์ ์ง์ ์ด์ผ. ์ ๋ ๊ณ ์ฐจ์ ํจ์๋ฅผ ๊ฐ๋ฅด์น๊ธฐ์ํ ์ปค๋ฆฌํ๋ผ์ ์์
์ค์
๋๋ค ( Array.prototype
๋ฅผ ์์์ ์ผ๋ก ์ฌ์ฉ). ์ด๊ฒ์ด ์ ๋ฅผ์ด ๋ฌธ์ ๋ก ์ด๋์์ต๋๋ค. ๋งค์ฐ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก!
์ถ์ -ํ ์คํธ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ค์ ๋ก _ ์๋ _ ํ ๋ ์ ๋ง ์ง๋ฃจํฉ๋๋ค!
์ด๊ฒ์ด ์ผ๋ง๋ ์ ์ฉํ ์ง ์ ์ ์์ต๋๋ค. ๋๊ตฌ๋ ์ง ์ด๊ฒ์ ๋ํด ๋ ๊น์ด ํ๊ณ ์ถ๋ค๋ฉด ๋ฉ์ง ๊ฒ์ ๋๋ค.
๋ฐํ ๋ ํจ์์ ์ด๋ฆ์ ์์กดํ๋ ๊ธฐ๋ฅ์ด๋ ํ ์คํธ๊ฐ์์ ์ ์์ต๋๋ค. ๊ทธ๋ด ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ผ์ํด์ผํฉ๋๋ค.
@mroderick ์๋ณธ์ผ๋ก ์คํ์ด๋ฅผ ๋ง๋ค ๋ Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name })
ํด์ผํฉ๋๊น?
๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.-ํจ์์ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ์คํ์ด์ ์ด๋ฆ์ ์ง์ -๊ธธ์ ์์ด๋ฒ๋ฆฐ ๊ฒ ๊ฐ์์. ๋๋ ๊ทธ๊ฒ์ ๋ช ์ ์ ์ผ๋ก ๋ช ๋ช ํ๋ ๊ฒ์ ํ์ฉํ๋ ์ ์์ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ "ํ๋ก์"์ด๋ฆ๋ ๋ณ๊ฒฝํด์ผํ์ง ์์ต๋๊น? ๋๋ ์คํ์ด ๊ธฐ๋ฅ์ด ์๋์ ๊ธฐ๋ฅ๊ณผ ์ต๋ํ ๊ฐ๊น๊ฒ ๋ณด์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ arity๋ฅผ โโ๋ณด์ฅํ์ง๋ง ์ง๊ธ์ ์ด๋ฆ์ ๋ณ๊ฒฝํฉ๋๋ค. ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.
API์๋ spy.named(name)
๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐฉ๊ธ ๊นจ๋ฌ์์ต๋๋ค. ๐ ์คํ์ด์ displayName
์์ฑ์ ์ค์ ํฉ๋๋ค. ํจ์ ์ด๋ฆ๋ ๋ฐ๊ฟ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ง๊ธ ์ด๊ฑธ๋ณด์ธ์.
# 1987์ ํจ์น๋ v7.2.7
์ ์ถ์๋์์ต๋๋ค. ์ด๊ฒ์ด ๋ชจ๋์๊ฒ ๋ง์กฑ ์ค๋ฌ์ด์ง ์๋ ค์ฃผ์ญ์์ค โค๏ธ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์๋ณด๊ณ ์๋ค; ํญ์ ์ด๋ฆ์ด
proxy
๋ผ๊ณ ํ์๋์ด ์์ง๋งObject.defineProperty(spy, 'name', { value: 'new name' })
์ด๋ฉด "new name"์๋ณด๊ณ ํฉ๋๋ค.์ด๊ฒ์ ๋ค์ ์ด๋ฉด ์ข์ ๊ฒ์ ๋๋ค.