Skip to main content
Mock Context๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ , ์ธ์ฆ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

runWithMockContext๋ž€?

runWithMockContext๋Š” Sonamu์˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๊ฒฉ๋ฆฌ๋œ Context๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Sonamu๋Š” AsyncLocalStorage๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ๋…๋ฆฝ๋œ Context๋ฅผ ์œ ์ง€ํ•˜๋Š”๋ฐ, ํ…Œ์ŠคํŠธ์—์„œ๋„ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Context์˜ ๊ตฌ์„ฑ ์š”์†Œ

Mock Context๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:
ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฐ„์†Œํ™”๋œ Mock Context๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์ผ๋ฐ˜ ํ…Œ์ŠคํŠธ (๋น„์ธ์ฆ)

Sonamu์—์„œ ์ œ๊ณตํ•˜๋Š” test() ํ•จ์ˆ˜๋Š” ์ž๋™์œผ๋กœ runWithMockContext๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ์‚ฌ์šฉํ•˜๊ธฐ

runWithMockContext๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

testAs() ์‚ฌ์šฉ

ํŠน์ • ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด testAs()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

ํƒ€์ž… ์•ˆ์ „์„ฑ

testAs()๋Š” ์ œ๋„ค๋ฆญ์„ ์ง€์›ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:

์‹ค์ „ ์˜ˆ์ œ

Model ๋ฉ”์„œ๋“œ ํ…Œ์ŠคํŠธ

๊ถŒํ•œ ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ

Context ์†์„ฑ ์กฐ์ž‘

ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Context ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

test() vs testAs() ๋น„๊ต

๋น„์ธ์ฆ ํ…Œ์ŠคํŠธ
์‚ฌ์šฉ ์‹œ๊ธฐ:
  • ์ธ์ฆ์ด ํ•„์š” ์—†๋Š” ๊ณต๊ฐœ API ํ…Œ์ŠคํŠธ
  • ์ธ์ฆ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•œ ๋กœ์ง ํ…Œ์ŠคํŠธ
  • Model์˜ ๊ธฐ๋ณธ CRUD ์ž‘์—… ํ…Œ์ŠคํŠธ

๋‚ด๋ถ€ ๊ตฌ์กฐ

getMockContext()

Mock Context๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:
ํŠน์ง•:
  • session: null๋กœ ์ดˆ๊ธฐํ™” (๋ฏธ์ธ์ฆ ์ƒํƒœ)
  • user: ๊ธฐ๋ณธ๊ฐ’์€ null (๋ฏธ์ธ์ฆ ์ƒํƒœ)
  • naiteStore: ๊ฐ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ๋…๋ฆฝ๋œ ๋กœ๊ทธ ์ €์žฅ์†Œ
  • locale: ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ดˆ๊ธฐํ™”

AsyncLocalStorage ๊ฒฉ๋ฆฌ

Sonamu๋Š” Node.js์˜ AsyncLocalStorage๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Context๋ฅผ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค:
๊ฒฉ๋ฆฌ์˜ ์ด์ :
  • ํ…Œ์ŠคํŠธ ๊ฐ„ Context๊ฐ€ ์„ž์ด์ง€ ์•Š์Œ
  • ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ์—๋„ ์•ˆ์ „
  • ๊ฐ ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ๋œ Naite ๋กœ๊ทธ ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ง

test() ๋ž˜ํผ์˜ ์ž‘๋™ ์›๋ฆฌ

Sonamu์˜ test() ํ•จ์ˆ˜๋Š” Vitest์˜ test()๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์ž๋™์œผ๋กœ Mock Context๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:
์ฒ˜๋ฆฌ ๊ณผ์ •:
  1. Vitest์˜ test() ์‹คํ–‰
  2. runWithMockContext()๋กœ Mock Context ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
  3. ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์‹คํ–‰
  4. ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ Naite ๋กœ๊ทธ ์ˆ˜์ง‘
  5. Context ์ž๋™ ์ •๋ฆฌ

testAs() ๊ตฌ์กฐ

testAs()๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ๋ฐ›์•„ Context๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค:

์ฃผ์˜์‚ฌํ•ญ

Context ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ:
  1. test() ์™ธ๋ถ€์—์„œ Context ์ ‘๊ทผ ๋ถˆ๊ฐ€: Sonamu.getContext()๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. Context ์ˆ˜์ •์˜ ์˜ํ–ฅ ๋ฒ”์œ„: Context๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  3. testAs() ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ: ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค.
  4. ํƒ€์ž… ์•ˆ์ „์„ฑ: testAs()์˜ ์‚ฌ์šฉ์ž ํƒ€์ž…์€ AuthContext["user"]๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

Database Mocking

ํŠธ๋žœ์žญ์…˜์œผ๋กœ DB ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌํ•˜๊ธฐ

API Mocking

์™ธ๋ถ€ API ํ˜ธ์ถœ ๋ชจํ‚นํ•˜๊ธฐ

Naite ๋กœ๊น…

ํ…Œ์ŠคํŠธ ๋กœ๊ทธ ๊ธฐ๋ก ๋ฐ ์ถ”์ 

Bootstrap

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ดˆ๊ธฐํ™”