TDD 실습 (3)

노력하는백엔드·2026년 3월 8일

이론 정리

목록 보기
13/14
  • Red
    • 메모 삭제에 대한 필수 값 누락, 검증에 대한 테스트 진행
      • id 필요
      • id 타입 검증
      • id 범위 검증
      • 존재하지 않는 id 에러
      • 삭제 성공 시 true 반환
    • 코드
      const { deleteMemo } = require("../../src/memo/deleteMemo");
      
      describe("deleteMemo", () => {
        test("정상 id이면 memo 삭제에 성공한다", async () => {
          const result = await deleteMemo(1);
      
          expect(result).toBe(true);
        });
      
        test("id가 없으면 에러 발생", async () => {
          await expect(deleteMemo()).rejects.toThrow("id");
        });
      
        test("id가 null이면 에러 발생", async () => {
          await expect(deleteMemo(null)).rejects.toThrow("id");
        });
      
        test("id가 문자열이면 에러 발생", async () => {
          await expect(deleteMemo("1")).rejects.toThrow("id");
        });
      
        test("id가 0이면 에러 발생", async () => {
          await expect(deleteMemo(0)).rejects.toThrow("id");
        });
      
        test("존재하지 않는 id이면 에러 발생", async () => {
          await expect(deleteMemo(999)).rejects.toThrow("memo is not find");
        });
      });
      
    • 실행 결과
      hongseongchae@hongseongchaeui-MacBookPro tdd_study % npm test
      
      > tdd_study@1.0.0 test
      > jest
      
       FAIL  __test__/memo/deleteMemoList.test.js
        ● deleteMemo › 정상 id이면 memo 삭제에 성공한다
      
          TypeError: deleteMemo is not a function
      
            3 | describe("deleteMemo", () => {
            4 |   test("정상 id이면 memo 삭제에 성공한다", async () => {
          > 5 |     const result = await deleteMemo(1);
              |                          ^
            6 |
            7 |     expect(result).toBe(true);
            8 |   });
      
            at Object.deleteMemo (__test__/memo/deleteMemoList.test.js:5:26)
      
        ● deleteMemo › id가 없으면 에러 발생
      
          TypeError: deleteMemo is not a function
      
             9 |
            10 |   test("id가 없으면 에러 발생", async () => {
          > 11 |     await expect(deleteMemo()).rejects.toThrow("id");
               |                  ^
            12 |   });
            13 |
            14 |   test("id가 null이면 에러 발생", async () => {
      
            at Object.deleteMemo (__test__/memo/deleteMemoList.test.js:11:18)
      
        ● deleteMemo › id가 null이면 에러 발생
      
          TypeError: deleteMemo is not a function
      
            13 |
            14 |   test("id가 null이면 에러 발생", async () => {
          > 15 |     await expect(deleteMemo(null)).rejects.toThrow("id");
               |                  ^
            16 |   });
            17 |
            18 |   test("id가 문자열이면 에러 발생", async () => {
      
            at Object.deleteMemo (__test__/memo/deleteMemoList.test.js:15:18)
      
        ● deleteMemo › id가 문자열이면 에러 발생
      
          TypeError: deleteMemo is not a function
      
            17 |
            18 |   test("id가 문자열이면 에러 발생", async () => {
          > 19 |     await expect(deleteMemo("1")).rejects.toThrow("id");
               |                  ^
            20 |   });
            21 |
            22 |   test("id가 0이면 에러 발생", async () => {
      
            at Object.deleteMemo (__test__/memo/deleteMemoList.test.js:19:18)
      
        ● deleteMemo › id0이면 에러 발생
      
          TypeError: deleteMemo is not a function
      
            21 |
            22 |   test("id가 0이면 에러 발생", async () => {
          > 23 |     await expect(deleteMemo(0)).rejects.toThrow("id");
               |                  ^
            24 |   });
            25 |
            26 |   test("존재하지 않는 id이면 에러 발생", async () => {
      
            at Object.deleteMemo (__test__/memo/deleteMemoList.test.js:23:18)
      
        ● deleteMemo › 존재하지 않는 id이면 에러 발생
      
          TypeError: deleteMemo is not a function
      
            25 |
            26 |   test("존재하지 않는 id이면 에러 발생", async () => {
          > 27 |     await expect(deleteMemo(999)).rejects.toThrow("memo");
               |                  ^
            28 |   });
            29 | });
            30 |
      
            at Object.deleteMemo (__test__/memo/deleteMemoList.test.js:27:18)
      
       PASS  __test__/memo/readMemo.test.js
       PASS  __test__/memo/readMemoList.test.js
       PASS  __test__/memo/createMemo.test.js
      
      Test Suites: 1 failed, 3 passed, 4 total
      Tests:       6 failed, 37 passed, 43 total
      Snapshots:   0 total
      Time:        0.606 s, estimated 1 s
      Ran all test suites.
    • Red인 경우 테스트 코드를 정의하는 단계(실패하는 케이스)이므로 실질적인 구현이 없으므로 모두 실패가 나온다
  • Green
    • Red를 바탕으로 테스트 코드를 구현한다
    • 코드
      const mockMemos = [
        {
          id: 1,
          title: "TDD 메모 작성",
          period: {
            startDate: "2026-03-06",
            endDate: "2026-03-10",
          },
          content: "첫 번째 메모",
          priority: 3,
          isSuccess: false,
        },
        {
          id: 2,
          title: "두 번째 메모",
          period: {
            startDate: "2026-03-07",
            endDate: "2026-03-12",
          },
          content: "두 번째 내용",
          priority: 2,
          isSuccess: true,
        },
        {
          id: 3,
          title: "세 번째 메모",
          period: {
            startDate: "2026-03-08",
            endDate: "2026-03-15",
          },
          content: "세 번째 내용",
          priority: 3,
          isSuccess: true,
        },
        {
          id: 4,
          title: "네 번째 메모",
          period: {
            startDate: "2026-03-09",
            endDate: "2026-03-18",
          },
          content: "네 번째 내용",
          priority: 1,
          isSuccess: false,
        },
      ];
      
      async function deleteMemo(id) {
        if (typeof id !== "number" || id <= 0) {
          throw new Error("id");
        }
      
        const index = mockMemos.findIndex((item) => item.id === id);
      
        if (index === -1) {
          throw new Error("memo is not find");
        }
      
        mockMemos.splice(index, 1);
      
        return true;
      }
      
      module.exports = { deleteMemo };
      
    • 실행결과
      hongseongchae@hongseongchaeui-MacBookPro tdd_study % npm test
      
      > tdd_study@1.0.0 test
      > jest
      
       PASS  __test__/memo/deleteMemo.test.js
       PASS  __test__/memo/createMemo.test.js
       PASS  __test__/memo/readMemo.test.js
       PASS  __test__/memo/readMemoList.test.js
      
      Test Suites: 4 passed, 4 total
      Tests:       43 passed, 43 total
      Snapshots:   0 total
      Time:        0.498 s, estimated 1 s
      Ran all test suites.
  • blue
    • Green을 통과한 기준으로 refactoring을 한다
    • validation 함수를 분리
    • 코드
      const mockMemos = [
        {
          id: 1,
          title: "TDD 메모 작성",
          period: {
            startDate: "2026-03-06",
            endDate: "2026-03-10",
          },
          content: "첫 번째 메모",
          priority: 3,
          isSuccess: false,
        },
        {
          id: 2,
          title: "두 번째 메모",
          period: {
            startDate: "2026-03-07",
            endDate: "2026-03-12",
          },
          content: "두 번째 내용",
          priority: 2,
          isSuccess: true,
        },
        {
          id: 3,
          title: "세 번째 메모",
          period: {
            startDate: "2026-03-08",
            endDate: "2026-03-15",
          },
          content: "세 번째 내용",
          priority: 3,
          isSuccess: true,
        },
        {
          id: 4,
          title: "네 번째 메모",
          period: {
            startDate: "2026-03-09",
            endDate: "2026-03-18",
          },
          content: "네 번째 내용",
          priority: 1,
          isSuccess: false,
        },
      ];
      function validateId(id) {
        if (typeof id !== "number" || id <= 0) {
          throw new Error("id");
        }
      }
      async function deleteMemo(id) {
        validateId(id);
      
        const index = mockMemos.findIndex((item) => item.id === id);
      
        if (index === -1) {
          throw new Error("memo is not find");
        }
      
        mockMemos.splice(index, 1);
      
        return true;
      }
      
      module.exports = { deleteMemo };
      
    • 실행 결과
      hongseongchae@hongseongchaeui-MacBookPro tdd_study % npm test
      
      > tdd_study@1.0.0 test
      > jest
      
       PASS  __test__/memo/deleteMemo.test.js
       PASS  __test__/memo/createMemo.test.js
       PASS  __test__/memo/readMemoList.test.js
       PASS  __test__/memo/readMemo.test.js
      
      Test Suites: 4 passed, 4 total
      Tests:       43 passed, 43 total
      Snapshots:   0 total
      Time:        0.556 s, estimated 1 s
      Ran all test suites.
profile
열심히 노력하는 백엔드입니다.

0개의 댓글