JEST#1-1.게시물 CRUD 기능 테스트

깡통·2024년 2월 7일
0

- 내가 정말 잘못 생각한게 있었는데, 아무리 불완전하더라도 일단 프로젝트 할땐 통일된 database 스키마가 나와야 한다고 한다. 마지막에 가서 schema를 완성시키는 생각은 앞으로도 하지 말자

  • 내가 생각했던 접근법은 그냥 말도 안되는 접근법임. 뭐가 됐든 스키마부터 만들고 시작해야함.(일부분이라도 '실제'스키마는 만들어 놔야 함!)

  • 나중에 다시 짜겠다는 말은, api랑 기획 다 해놓고 다 만들어 놓은 후에, 프로젝트 막판 가서 다 부숴버리고는 api부터 해서 전부다 새로 만들겠다라는 말임. 주객이 아예 전도된 거임.

  • router에는 await이 별 의미를 갖지 못한다.

  • jest는 원래 commonJs(es5 및 그 이전) 환경에서만 작동하는데, 최신 버전들은 위 코드를 pakcage.json에 추가하면 es6 모듈로도 사용이 가능하다.
javascript

import express from "express";
import jest from "jest";

const app = express();
const router = express.Router();

async function postWrite() {
  const req = {
    locals: { user: {} },
    body: {},
  }; // 가짜 요청 객체 생성

  req.locals.user = { id: 1, name: "국밥의 왕" };
  req.body = {
    title: "국밥",
    content: "멋진 국밥",
    photo1: "국밥1",
    photo2: "국밥2",
    photo3: "국밥3",
    photo4: "국밥4",
  };

  router.post("/postView", async (req, res, next) => {
    try {
      const { id, name } = req.locals.user; //id = users 테이블의Id
      const { title, content, photo1, photo2, photo3, photo4 } = req.body;
      const post = await prisma.posts.create({
        data: {
          id: +id,
          title,
          author: name,
          content,
        },
      });
      const photos = await prisma.photos.create({
        data: {
          postId: +post.id,
          photo1,
          photo2,
          photo3,
          photo4,
        },
      });
      return res.status(201).json({
        message: "게시물 작성이 완료되었습니다.",
        data: {
          title: post.title,
          author: post.author,
          photo1: photos.photo1,
          photo2: photos.photo2,
          photo3: photos.photo3,
          photo4: photos.photo4,
          createdAt: post.createdAt,
        },
      });
    } catch (error) {
      next(error);
    }
  });
}

test("국밥", () => {
  expect(postWrite()).toBe(
    res.status(201).json({
      message: "게시물 작성이 완료되었습니다.",
      data: {
        title: post.title,
        author: post.author,
        photo1: photos.photo1,
        photo2: photos.photo2,
        photo3: photos.photo3,
        photo4: photos.photo4,
        createdAt: post.createdAt,
      },
    })
  );
});
  • 위 테스트 코드의 결과다, 위 코드는 길어보이지만 실제로는 게시물 작성이라는 하나의 기능 밖에 갖고 있지 않기 때문에 1함수 1기능 원칙을 지켰다고 생각한다.(아닐려나, 물어봐야지)

  • express 모듈을 설치하고 활성화까지 시켜놨는데, 왜 express모듈의 메서드를 참조하지 못하지?

  • 그래서 아예 express 모듈과 관련된 메서드를 빼버렸다. 그랬더니...

  • 기댓값과 실제 값이 다르다고 나왔다. 지피티 말로는 테스트 하는 함수가 비동기 함수라서 그렇다고, toEqual을 써보라고 한다.
  • 똑같은 결과가 나왔다. 아무래도 Babel이란 친구를 써봐야 할듯 하다...

  • 서로 관계가 설정되어 있는 테이블끼리는 'photos: {photo}'처럼 join하는 방식으로도 새로 생성할 수 있다.
  • 1:n 관계니까 photo 1 ~ 4가 필요가 없었음.
profile
코딩하러 온 사람입니다.

0개의 댓글