2.4.1์์ 3.2.1๋ก ์ ๊ทธ๋ ์ด๋๋ฅผ ์๋ํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด ์ฝ๋๋ 2.4.1์์ ์๋ํฉ๋๋ค.
const spy = sandbox.spy();
sandbox.stub(window, 'google').value({
maps: {
LatLng: x => x,
Map: spy
}
});
๊ทธ๋ฌ๋ 3.2.1์์๋ TypeError: Cannot stub non-existent own property google
์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋์ ์ธ๊ธ๋์ด ์์ง ์์ผ๋ฏ๋ก ํ๊ท๋ก ๋ณด์ ๋๋ค.
# 1512์ ๊ด๋ จ์ด ์์ต๋๋ค.
์์ฑ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ ๋ฐ์ค์ ์ถ๊ฐ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฎ์ด ์ฐ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค. ํ์ง๋ง ์, ์ด์ ์ ํจ๊ณผ๊ฐ ์์๊ณ ๋ณ๊ฒฝํด์ผํ๋ค๊ณ ๋ช ์ ์ ์ผ๋ก ๋งํ์ง ์์๋ค๋ฉด ํ๊ท์ ๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์์ํด์ผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์กด์ฌํ์ง ์๋ ๊ฐ์ ์คํฐ ๋นํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ์๊ณ ์ง์๋์ง ์๋๋ค๊ณ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๊ฐ๋ฅํ๊ฒ ๋ง๋์๊ฒ ์ต๋๊น?
์์ฑ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ ๋ฐ์ค์ ์ถ๊ฐ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฎ์ด ์ฐ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค.
์๋ ๋ฐ์ค์ ์์ฑ์ ์ถ๊ฐ ํ ๋ ์ข์ ์ ์ sinon์ด sandbox.restore()
๋ฅผ ํตํด ๊ฐ ํ
์คํธ๊ฐ์ ์ ์ญ ํ
์คํธ ํ๊ฒฝ์ ๊นจ๋ํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด๋๋ค๋ ๊ฒ์
๋๋ค. ํนํ API๋ฅผ ์ ์ดํ์ง ์๋ Google Maps์ ๊ฐ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์
๋๋ค. 3.x ๋ผ์ธ์์ ์๋ํ๋๋ก ๋ง๋ค ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ํ ๋๋ ์์ ํ ์๋ฅผ ์ ๊ณตํ์ง ์๋ ์ฃ๋ฅผ ์ ์ง๋ ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ด ์๋ ๋ฐ์ค๋ 2.4.1 ํ์์ผ๋ก ์์ฑ๋ฉ๋๋ค.
let sandbox;
before(() => { sandbox = sinon.sandbox.create(); })
afterEach(() => { sandbox.restore(); })
๊ทธ๊ฒ์ด ์ค์ํ์ง ํ์คํ์ง ์์ต๋๋ค. ๋ ๋นจ๋ฆฌ ์ ๊ณตํ์ง ์์ ๊ฒ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
@ZebraFlesh๊ฐ ์ค๋ช ํ๋ ์๋๋ฆฌ์ค์ ๊ฐ์ ์๋๋ฆฌ์ค์์ ํ ์คํธ ๊ณ ์ ์ฅ์น๋ฅผ ๋ ๋ช ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
// not so explicit, doesn't work with [email protected]
beforeEach(function() {
const spy = sandbox.spy();
sandbox.stub(window, 'google').value({
maps: {
LatLng: x => x,
Map: spy
}
});
});
// more explicit, works with sinon<strong i="9">@2</strong>, sinon<strong i="10">@3</strong>
function setGoogleMapsFixture(sandbox) {
window.google = {
maps: {
LatLng: x => x,
Map: sandbox.spy()
}
};
}
function removeGoogleMapsFixture() {
delete window.google;
}
beforeEach(function() {
setGoogleMapsFixture(sandbox)
});
// not using afterEach, as this only needs to happen
// after the last test in this block is run
after(function() {
removeGoogleMapsFixture();
});
์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด ์กฐ๋ช ๊ธฐ๋ฅผ๋ณด๋ค ๋ช ์ ์ ์ผ๋ก ์ค์ ํ๋ฉด ์กด์ฌํ์ง ์๋ ์์ฒด ์์ฑ์ ์คํฐ ๋น์ ํ์ฉํ๋ Sinon์ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์์ํด์ผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์กด์ฌํ์ง ์๋ ๊ฐ์ ์คํฐ ๋นํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ์๊ณ ์ง์๋์ง ์๋๋ค๊ณ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๊ฐ๋ฅํ๊ฒ ๋ง๋์๊ฒ ์ต๋๊น?
(@ZebraFlesh์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์) ์ผ๋ถ ์๋๋ฆฌ์ค์์ ํธ๋ฆฌ ํ ์ โโ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์กด์ฌํ์ง ์๋ ์์ฒด ์์ฑ์ ์คํฐ ๋นํ๋ ๊ฒ์ ํ ์คํธ์์ ์ค์๋ก ์ด์ด์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์คํ ํ๋ ค๋ ๊ธฐ์กด ์์ฐ. ์ฐ๋ฆฌ๋ ๋๋ฌด ์ ํ์ ์ด์ง ์์ผ๋ฉด ์ ์ค์์ ๊ฐ๋ฅ์ฑ์ ์์ ๋ ๊ฒ์ ๋ชฉํ๋กํด์ผํฉ๋๋ค.
์กด์ฌํ์ง ์๋ ์์ฒด ์์ฑ์ ์คํฐ ๋นํ๋ ๊ฒ์ ์ง์๋์ง ์์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํด์ผํฉ๋๋ค.
@mroderick ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์๋ค๋ ์ ์์ ๋์ํ์ง๋ง ์ด๋ฏธ ์ผ๋ฐ ์คํ ์ ๋ํด์๋์ด๋ฅผ ์ง์ํฉ๋๋ค. ์ด ๋์ ์ง์์ ์ค๋จํด์ผํ๋ ๊ฒฝ์ฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ํด๋น ๋์๋ ์ ๊ฑฐํด์ผํฉ๋๋ค. ์๋ ๋ฐ์ค๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ช ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ _add_ํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ฐ์ค ์ธ๋ถ์์๋ง์ด ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฒ์ ์ด์ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ง๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ํ๊ดด ๊ธฐ๋ฅ์ด๋ฏ๋ก ํฐ ๋ฒํ๋ ํ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ค์ ์ค ํ๋์ ๋๋ค.
๋๋ / ๋ฐ (?)
์์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด ์กฐ๋ช ๊ธฐ๋ฅผ๋ณด๋ค ๋ช ์ ์ ์ผ๋ก ์ค์ ํ๋ฉด ์กด์ฌํ์ง ์๋ ์์ฒด ์์ฑ์ ์คํฐ ๋น์ ํ์ฉํ๋ Sinon์ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ต๋๋ค.
๋๋ ๋น์ ์ ์กฐ๋ช ๊ธฐ๊ฐ ๋น์ ์ ํ ์คํธ ์ฌ์ด์ ๊ฒฐ์ฝ ๋ณํ์ง ์๋๋ค๋ฉด ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด ๋นํ์ ๊ทธ๋ ์ต๋๋ค. ๊ฐ๋จํ ์๋ ์ฑ๊ณต ๋ฐ ์คํจ ์ฌ๋ก๋ฅผ ๋ชจ๋ ๋ค๋ฃจ๋ ๊ฒ์ ๋๋ค.
it('handles the success case', () => {
const spy = sandbox.spy();
sandbox.stub(window, 'google').value({
maps: {
LatLng: x => x,
Map: spy
}
});
// ... test, including asserting that the spy was called
});
it('handles the failure case', () => {
const msg = 'test error';
sandbox.stub(window, 'google').value({
maps: {
LatLng: x => x,
Map: sandbox.stub().throws(new Error(msg))
}
});
// ... test, ignoring spy calls and instead focusing on error handling
});
2.x์ ๋์์ sandbox.restore()
๋ฅผ ํตํด ๊ฐ ํ
์คํธ ํ ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฆฌ๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์์ ์ค๋ช
๋๋ณด๋ค ๋ช
์์ ์ธ ์กฐ๋ช
๊ธฐ ์ค์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด afterEach
ํํฌ์์ ์์ ํ์ง ์์ ์์ฑ์ ์ญ์ ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ค์๋ก ๊ธฐ์กด ์์ฑ์ ์ด๋ฆ์ ์ ๋ ฅํ์ฌ ์ ์ฌ์ ์ธ ์ค์๋ฅผ ์ ๋ฐํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด sinon์ ๊ณต์ฉ API๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
stub.ownValue()
: ์์ ์ ์์ฑ ๋ง ์คํ
, ์์ ํ์ง ์์ ์์ฑ์ ๋ํด ๋ฐ์stub.value()
: ์์ ํ์ง ์์ ์์ฑ ๋ง ์คํ
ํ๊ณ ์์ ์ ์์ฑ์ ๋ํด throwํฉ๋๋ค.API๊ฐ ๋์ฑ ๋ช ํ ํด์ง๊ณ ์๋น์๋ ๋น๋ฉดํ ์์ ์ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํด์ผํฉ๋๋ค.
@lucasfcosta๋ ๋ฐ๋ ๊ฒฌํด๋ฅผ ๊ฐ์ง๊ณ ์๊ฐ (์ ์ ์คํ
๋ค๋ฃจ๊ณ ์์ง๋ง) ์ด๊ฒ์ ๋งค์ฐ # 1508์์ ํ ๋ก ๊ด๋ จ์ด์๋ค - ์ฐ๋ฆฌ๊ฐํ์ง ์๋ throw_ _should์ด undefined
์์ฑ. ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ์ฐฉ์ํ๋ , ๋๋ ์ผ๋ฐ ์คํ
๊ณผ ์๋ ๋ฐ์ค๋ฅผ์ํ ์คํฐ ๋น API์์ _ ์ผ๊ด ์ ์ด์ด์ผํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ ๊ฒฝ์ฐ์๋ง ์ง์ํด์๋ ์๋๋ฉฐ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ง์ํ์ง ์์์ผํฉ๋๋ค.
ํ์ฌ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ์ ์ ๋์ ๊ธฐ๋ฅ ํจ๋ฆฌํฐ๊ฐ ์์์ง๋ง ๋ค์ ์์ด ๋ฒ๋ ธ์ต๋๋ค.์ด ์ง๊ทธ์ฌ๊ทธ๊ฐ ์ฌ์ฉ์์๊ฒ๋ณ๋ก ์ ์ตํ์ง ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก์ด ๋ ผ์๋ฅผ ์์ํด์ผํฉ๋๋ค. ์ข ๋ ๊ตฌ์ฒด์ ์ธ ํ ์คํธ๋ฅผ ํ ์ ์๋ค๋ ์ ์์ Morgan๊ณผ ๋์ํ์ง๋ง ๋ ๊ฐ์ง ์ฃผ์ ๋ฆด๋ฆฌ์ค์ ๋ํ ๋์์ ์ญ์ ํ ๋ค์ ๋ค์ ์ถ๊ฐํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ์ด ํ๊ท๋ฅผ ๋๋๋ฆฌ๋ ค๋ฉด ์ต์ํ์ ์์ (๊ณ ๊ฐ์ ๋ํ ์์ ,์ด ์ถ์ ๊ธฐ์ ์ง๋ฌธ / ๋ฌธ์ )์ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ถํธ ํจ์ ์ดํดํ์ง๋ง ์ต์ํ์ ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ฌ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
before(function() {
window.google = 'This is a placeholder for sinon to overwrite.';
});
after(function() {
delete window.google;
});
์ด๋ฅผ ํตํด sinon ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
ํ ์คํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์๋๋ ๋์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์๊ฐ์ ๊ทธ๊ฒ์ ๋ฐ์ํ๊ธฐ ์ํด ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํด์ผํฉ๋๋ค. ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ฉ๋ฉ๋๋ค.
@fearphage ํ์ ์ ์ง๋ ์กด์ฌํ์ง ์๋ ํ๋๋ฅผ
ํด๊ฒฐ ๋ฐฉ๋ฒ์ # 1557์์ ๊ตฌํ๋์์ต๋๋ค.
๋ค์ํ ์ค๋ ๋๋ฅผ ์ฝ์์ผ๋ฉฐ ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ์ ์ ์์ง๋ง ํด๋์ค ํ๋กํ ํ์
์์ ๊ตฌํ๋๋ ํจ์๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ Typescript์์๋ ์ ๋ง ๊ณ ํต ์ค๋ฝ์ต๋๋ค.์ด ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง sinon์ด ๋๋ฏธ๋ฅผ ๋ฑ์ด๋
๋๋ค. ํ๋ช
ํฉ๋๋ค ( keyof YourType
๋ ํ๋กํ ํ์
์ฒด์ธ ์๋์ ์ ์ ๋ ๋ชจ๋ ๊ณต์ฉ ํจ์๋ฅผ ๊ธฐ๊บผ์ด ํ์ฉํ๋ฏ๋ก).
๋๋ Typescript๊ฐ ์๋ง๋ ๋น์ ๋ค์๊ฒ ์ฐ์ ์์๊ฐ ์๋๋ผ๋ ๊ฒ์ ์์ง๋ง JS์์๋ myObject.callMe()
๋ ์๋ฒฝํ๊ฒ ํ๋ณตํ๊ฒ ์คํ๋๋ ๋ฐ๋ฉด sinon.stub(myObject, "callMe")
๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์คํฐ๋ธํ๋ ๋ฐฉ๋ฒ์ ์๊ธฐ ์ํด ํน์ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ๊ฒฐํฉ๋์๋์ง ์กฐ์ฌํ์ง ์๊ณ ์ถ์ง ์์ต๋๋ค.
ํด๋์ค๊ฐ JS์์ ๋ ๋ง์ ๊ธฐ๋ณธ ์ง์์ ๋ฐ๊ณ ์๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ์ด๊ฒ์ด ํ๋ณตํ ๊ฒฝ๋ก๋ฅผ ๋ง๋๋ ์ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฉ์๋๊ฐ ๊ฐ์ฒด์ ์ ์๋์ด ์์ง ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ๊ฐ ํ๋กํ ํ์
์์์ ๊ฐ๋ฅ์ฑ์ด ์์์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ myObject.callMe = sinon.stub();
์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ ํ๋ ๊ฒ์ ๊ทธ๋ ๊ฒ ๋ฒ๊ฑฐ๋กญ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. IMHO ... ๋ํ ํ๋กํ ํ์
์ด ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ ๋ฆฌ / ํด์ฒด ๊ธฐ๋ฅ์ ๋ง๋ค์ง ์์๋๋ฉ๋๋ค.
๋ค, ํด๊ฒฐํ๊ธฐ๊ฐ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ ๊ฒ ๊ฐ์์. ์ฌ๋ฌผ์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์๊ธฐ ์ํด ๋์๊ฒ ๋ ๋ง์์ธ์ง ๋ถํ๋ฅผ ๊ฐํ๊ณ ์์ต๋๋ค.
๋ํ ์์์น ๋ชปํ ๊ฒ์ฒ๋ผ ๋ณด์๊ธฐ ๋๋ฌธ์ ๋์ผํ ๊ฐ์ฒด์ ๋ํด ์ฐ์ ๋ ๋ ์ค์ ์คํฐ ๋น ์ฝ๋๊ฐ ๋ค๋ฅธ ์ด์ ์ ๋ถํด์์ ์คํฐ๋ธ ์ค ํ๋๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ํ ์คํธ์ ์ฃผ์์ ์ถ๊ฐํด์ผํ๋ค๊ณ ๋๊ผ์ต๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ํ๋๋ ์๋ ๋ฐ์ค์์ ์ฒ๋ฆฌํ์ต๋๋ค.
~์ด ๋์์ ๋ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ~
์กด์ฌํ์ง ์๋ ์์ฑ ์คํฐ ๋น์ ์ง์ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก์์๋ ๊ตฌ์ฑ ๊ฐ์ฒด์ ์์ฑ์ ์คํฐ ๋นํ๊ณ ์์ต๋๋ค. config ๊ฐ์ฒด์๋ ๋ค์ํ ์ ํ์ ํค๊ฐ ์์ผ๋ฉฐ ๊ฐ๋ฐ์ ์ปดํจํฐ์์ ํ์ผ์๋ก๋ํ์ฌ ์ด๊ธฐํ๋ฉ๋๋ค. ํน์ ํ ์คํธ๋ฅผ ์คํํ ๋ ์๋ ค์ง ๊ฐ์ผ๋ก ์ค์ ๋ ํค ์ค ํ๋๊ฐ ํ์ํ๋ฉฐ ๊ฐ๋ฐ์์ ๊ฐ์ฒด๋ฅผ์๋ ๊ทธ๋๋ก ๋ณต์ํ๊ณ ์ถ์ต๋๋ค.
sandbox.stub(serverSecrets, 'the_key_i_need_set').value(fakeValue)
๋์ด๋ฅผ ์ ๋ฌํ๋ ๋งค์ฐ ๋ช
ํํ ๋ฐฉ๋ฒ์
๋๋ค. ๋ฐํ์์ ํค๊ฐ ์ค์ ๋์๋์ง ์ฌ๋ถ๋ฅผ ์์ง ๋ชปํ๋๋ผ๋ ๋์ผํ ๋์์ ์ป๋ ๊ฒ์ด ์ข์ต๋๋ค _.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
~์ด ๋์์ ๋ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ~
์กด์ฌํ์ง ์๋ ์์ฑ ์คํฐ ๋น์ ์ง์ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก์์๋ ๊ตฌ์ฑ ๊ฐ์ฒด์ ์์ฑ์ ์คํฐ ๋นํ๊ณ ์์ต๋๋ค. config ๊ฐ์ฒด์๋ ๋ค์ํ ์ ํ์ ํค๊ฐ ์์ผ๋ฉฐ ๊ฐ๋ฐ์ ์ปดํจํฐ์์ ํ์ผ์๋ก๋ํ์ฌ ์ด๊ธฐํ๋ฉ๋๋ค. ํน์ ํ ์คํธ๋ฅผ ์คํํ ๋ ์๋ ค์ง ๊ฐ์ผ๋ก ์ค์ ๋ ํค ์ค ํ๋๊ฐ ํ์ํ๋ฉฐ ๊ฐ๋ฐ์์ ๊ฐ์ฒด๋ฅผ์๋ ๊ทธ๋๋ก ๋ณต์ํ๊ณ ์ถ์ต๋๋ค.
sandbox.stub(serverSecrets, 'the_key_i_need_set').value(fakeValue)
๋์ด๋ฅผ ์ ๋ฌํ๋ ๋งค์ฐ ๋ช ํํ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฐํ์์ ํค๊ฐ ์ค์ ๋์๋์ง ์ฌ๋ถ๋ฅผ ์์ง ๋ชปํ๋๋ผ๋ ๋์ผํ ๋์์ ์ป๋ ๊ฒ์ด ์ข์ต๋๋ค _.