λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ—‚ WIL

ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±ν•΄λ³΄κΈ°

by nalong 2025. 6. 29.

ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ€‘μš”μ„±μ„ μ²΄κ°ν•˜κ³  μžˆμ—ˆμ§€λ§Œ, λ°”μ˜λ‹€λŠ” 이유둜 μ œλŒ€λ‘œ μž‘μ„±ν•˜μ§€ λͺ»ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•˜λ‹€.
μ‹ κ·œ κΈ°λŠ₯이 μ–½ν˜€ μžˆμ„μˆ˜λ‘ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ ν•„μš”μ„±μ€ 더 μ»€μ§€λŠ”λ°λ„, ν˜„μ‹€μ—μ„  λ²„κ·Έλ°°μ‹œ 전에 λ‚΄κ°€ 직접 λͺ¨λ“  μΌ€μ΄μŠ€λ₯Ό μ‘°ν•©ν•΄ 보고 이슈λ₯Ό μž‘μ•„λ‚΄λŠ” κ±Έ λ°˜λ³΅ν–ˆμ—ˆλ‹€. λ§Œμ•½ μ΄ˆκΈ°μ— λͺ‡ 개 μž‘μ„±ν•˜λ”λΌλ„, κΈ°λŠ₯이 μ—…λ°μ΄νŠΈλ  λ•Œλ§ˆλ‹€ ν…ŒμŠ€νŠΈ μ½”λ“œλ„ ν•¨κ»˜ μœ μ§€λ³΄μˆ˜ν•΄μ•Ό ν•˜λŠ”λ°, κ·Έ 과정을 λ†“μΉ˜λ‹€ 보면 ν…ŒμŠ€νŠΈλŠ” κΈˆμ„Έ μ‹€μ œ λ™μž‘κ³Ό μ–΄κΈ‹λ‚œ μƒνƒœκ°€ λ˜λŠ” κ²½μš°κ°€ ν—ˆλ‹€ν–ˆλ‹€. κ²°κ΅­ λ¬΄μ˜λ―Έν•œ ν…ŒμŠ€νŠΈλ§Œ μŒ“μ΄κ²Œ 되고, ν…ŒμŠ€νŠΈ 자체λ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠλŠ” νλ¦„μœΌλ‘œ 이어지곀 ν–ˆλŠ”λ°, AIκ°€ λ°œμ „ν•œ μ§€κΈˆ, ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ€ ν•„μˆ˜μ΄μ§€ μ•Šμ„κΉŒ? ν•˜λŠ” 생각이 λ“€μ—ˆλ‹€. μ˜ˆμ „μ— 쑰건 λΆ„κΈ°λž‘ λ Œλ”λ§ μΌ€μ΄μŠ€κ°€ μ›Œλ‚™ λ§Žμ•„μ„œ, ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μžˆμ—ˆμœΌλ©΄ 훨씬 μˆ˜μ›”ν–ˆμ„ 텐데... μ‹Άμ—ˆλ˜ μ»΄ν¬λ„ŒνŠΈ 트리λ₯Ό μ΄λ²ˆμ—” ν†΅μ§Έλ‘œ μ»€μ„œμ—κ²Œ λ„˜κ²¨ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•΄λ³΄κ²Œ ν–ˆλ‹€.
 
ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλŠ” μ•„λž˜μ™€ 같은 λ‹€μ–‘ν•œ 쑰건 쑰합에 따라 λ Œλ”λ§ κ²°κ³Όκ°€ λ‹¬λΌμ§€λŠ” κ΅¬μ‘°μ˜€λ‹€.

  • μ •λ‹΅ 수 μˆ¨κΉ€ μ—¬λΆ€
  • μ •λ‹΅μ˜ μˆœμ„œλ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ” μ˜΅μ…˜
  • 읽기 λͺ¨λ“œ
  • μ •λ‹΅ 숨기기 μ„€μ •
  • 학생 λ‹΅μ•ˆμ΄ μ •λ‹΅ μˆ˜λ³΄λ‹€ λ§Žμ€ 경우
  • ....

μ•„λž˜λŠ” μ»€μ„œκ°€ μƒμ„±ν•œ ν…ŒμŠ€νŠΈ 쀑 일뢀닀. 

it('hideCorrectAnswerκ°€ true일 λ•Œ 정닡이 ν‘œμ‹œλ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€', () => {
  const props = {
    ...defaultProps,
    editor: {
      options: { hideCorrectAnswer: true },
    },
  };

  render(
    <I18nProvider i18n={i18n}>
      <ResultComponent {...props} />
    </I18nProvider>,
  );

  const orderedResult = screen.getByTestId('ordered-result');
  expect(orderedResult).not.toHaveTextContent(/Correct:/);
});

 
κΈ°λ³Έ λ Œλ”λ§μ΄λ‚˜ 쑰건 λΆ„κΈ° κ²°κ³Όλ₯Ό 일일이 UIμ—μ„œ ν™•μΈν•˜μ§€ μ•Šμ•„λ„ ν…ŒμŠ€νŠΈλ‘œ λΉ λ₯΄κ²Œ 검증할 수 μžˆμ—ˆλ‹€.
 
λ¬Όλ‘  μ»€μ„œκ°€ μƒμ„±ν•œ μ½”λ“œκ°€ λ‹€ν–‰νžˆλ„ μ™„λ²½ν•˜μ§„ μ•Šμ•˜λ‹€. 예λ₯Ό λ“€μ–΄ descendants둜 λ‚΄λ €μ˜€λŠ” μ •λ‹΅ μˆ˜μ™€ μ •λ‹΅ λ°°μ—΄ 길이가 λ‹€λ₯Ό λ•Œ λ³΄μ—¬μ€˜μ•Ό ν•˜λŠ” ν•„λ“œλŠ” λ‹¨μˆœν•œ 길이 비ꡐ가 μ•„λ‹ˆλΌ 도메인 정책에 따라 νŒλ‹¨ν•΄μ•Ό ν–ˆκΈ° λ•Œλ¬Έμ—, ν•΄λ‹Ή ν…ŒμŠ€νŠΈ λ‘œμ§μ€ 직접 μˆ˜μ •ν•΄μ€˜μ•Ό ν–ˆλ‹€. λ˜ν•œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ €λ©΄ mock 정리가 λ¨Όμ € ν•„μš”ν–ˆλŠ”λ°, μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—λŠ” μ—¬λŸ¬ ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ—ˆκ³ , 전체 ꡬ쑰λ₯Ό κ·ΈλŒ€λ‘œ ν…ŒμŠ€νŠΈμ— λ„£κΈ°μ—” λ³΅μž‘λ„κ°€ μ§€λ‚˜μΉ˜κ²Œ λ†’μ•˜λ‹€. UI와 직접적인 관련이 μ—†λŠ” 뢀뢄은 μ „λΆ€ mock μ²˜λ¦¬ν–ˆκ³ , μ•„λž˜μ²˜λŸΌ λ‹¨μˆœν•œ ν˜•νƒœλ‘œ λŒ€μ²΄ν–ˆλ‹€.

jest.mock('../../ResultItemComponent', () => ({
  __esModule: true,
  default: ({ items, answers }) => (
    <div data-testid="ordered-result">
      <div>Answers: {items.map((item) => item.correctAnswer).join(', ')}</div>
      <div>Student Answers: {answers.map((item) => item.answer).join(', ')}</div>
    </div>
  ),
}));

 
ν•΄λ‹Ή ν…ŒμŠ€νŠΈλŠ” ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§ κ²°κ³Όλ₯Ό μ •ν™•νžˆ κ²€μ¦ν•˜λŠ” λͺ©μ λ³΄λ‹€λŠ”, μƒμœ„ 쑰건 뢄기에 따라 μ–΄λ–€ UIκ°€ ν‘œμ‹œλ˜λŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 데 μ΄ˆμ μ„ λ‘λŠ” 게 더 μ μ ˆν•˜λ‹€κ³  νŒλ‹¨ν–ˆκΈ° λ•Œλ¬Έμ— mock ꡬ쑰도 λΆ„κΈ° ν…ŒμŠ€νŠΈμ— ν•„μš”ν•œ μˆ˜μ€€κΉŒμ§€λ§Œ κ΅¬μ„±ν•˜μ˜€λ‹€.
 
μƒμœ„ μ»΄ν¬λ„ŒνŠΈμ˜ λΆ„κΈ° ν…ŒμŠ€νŠΈλ₯Ό 마친 λ’€, ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈλ“€ 쀑 ν•˜λ‚˜λ„ μ»€μ„œμ—κ²Œ ν…ŒμŠ€νŠΈ μ½”λ“œ 생성을 μ‹œμΌœλ΄€λ‹€.

it('학생 λ‹΅μ•ˆμ΄ μ •λ‹΅κ³Ό μΌμΉ˜ν•  λ•Œ A μƒνƒœκ°€ ν‘œμ‹œλ˜μ–΄μ•Ό ν•œλ‹€', () => {
  const props = {
    ...defaultProps,
    studentAnswers: [
      {
        id: '1',
        answer: 'correct answer',
        type: Type.Text,
      },
    ],
  };

  render(<ResultItemComponent {...props} />);
  expect(screen.getByTestId('state')).toHaveTextContent('A');
});

 
ν•΄λ‹Ή ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œλ„ 일뢀 νƒ€μž… μ—λŸ¬λ‚˜ μ •μ±…κ³Ό λ‹€λ₯Έ 뢀뢄듀이 μžˆμ—ˆμ§€λ§Œ, 직접 μˆ˜μ •ν•΄ μ£Όλ‹ˆ λ¬Έμ œμ—†μ΄ λ™μž‘ν–ˆλ‹€.

μ΄λ²ˆμ— 닀룬 μ»΄ν¬λ„ŒνŠΈ νŠΈλ¦¬λŠ” λ‹¨μˆœν•œ λ Œλ”λ§μ΄ μ•„λ‹ˆλΌ, μ˜΅μ…˜κ³Ό μƒνƒœμ— 따라 λ‹€μ–‘ν•œ λΆ„κΈ° μ²˜λ¦¬κ°€ ν•„μš”ν•œ ꡬ쑰라 λ‚΄ κΈ°μ€€μ—μ„œλŠ” ν…ŒμŠ€νŠΈ μž‘μ„± λ‚œμ΄λ„κ°€ κ½€ λ†’μ•˜μ§€λ§Œ, μ»€μ„œκ°€ κΈ°λ³Έ ꡬ쑰λ₯Ό μž‘μ•„μ€€ 덕뢄에 λΉ λ₯΄κ²Œ μ‹œμž‘ν•  수 μžˆμ—ˆκ³ , 이후 μ„ΈλΆ€ μ •μ±…λ§Œ λ³΄μ™„ν•˜λ©΄ λ˜λŠ” ν˜•νƒœλΌ νš¨μœ¨λ„ λ†’μ•˜λ‹€.
μ•žμœΌλ‘œλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œ 없이 λ„˜μ–΄κ°€λŠ” 일은 μ—†μ–΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€. πŸ”₯