2022. 8. 2. 13:56ㆍ항해99 일지
테스트코드 작성을 시작한지는 꽤 됐는데
처음에 코드를 작성할때는 기능 구현에만 초점이 맞춰져있어서 아 기능만 되면 됐지~ 라는 마인드로 했기때문에
코드가 엉망이여서 여러번 수정하고 또 수정했다.
최대한 한 기능에 한 메소드만 포함시키려고 노력했고 만약 A, B, C 기능에 모두 검색기능이 포함되어야 한다면
검색을 따로 빼서 각 API에 포함시켰다. 다 하고나니까 전에 isMember 라는 미들웨어를 구현해놓은것 처럼 됐다.
결국 A,B,C기능도 검색 결과가 없다면 시작할 필요도 없던 기능이였기때문에 편하게 됐다.
또 테스트 코드를 작성하면서 필요없는 조건들이 정말 많구나 생각이 들었다.
당시에는 꼼꼼하게 예외처리 한다고 달아놓은 조건들이 였는데 다시보니까 터무니없는 조건이거나 앞에 미들웨어에서
이미 충분히 체크해온 조건들이 였기에 다시 중복체크할 필요가 없었다.
JEST로 유닛 테스트코드를 작성할 때 중요한 건 Mock, 즉 그럴싸한 모조품을 구성하는 것이다.
테스트하려는 코드에 맞는 상황을 구현해주고 다른 기능에 의존하지 않게끔 되도록이면 그 기능만을 테스트하게끔 하는 것이다.
각각의 기능만을 테스트하고 그 기능에 변화가 생기면 그 테스트코드만 fail되어야 어디서 문제가 생겼는지 체크할 수 있게끔 하는 것이다.
이번 실전 프로젝트에서 중간중간 코드를 수정할 일, 스키마를 변경할 일, 분리하거나 변경할 일이 정말 많았는데
테스트 코드를 작성하면서 느낀건, 처음부터 했더라면. 이였다.
처음부터 테스트코드를 작성했으면 문제범위가 어디까지인지 빠르게 파악하고 수정하는데 시간을 덜 낭비했을 것이였다.
기초공사 같은 느낌이다. 처음엔 시간이 더 들더라도 후에 리모델링을 할 때 더 편한 마음으로 할 수 있다.
이미 그 기능이 구현하려는 틀은 잡혀있기 때문에 틀에 맞게만 수정하면 된다. 처음에 많은 시간을 쏟고 나중에 시간을 아끼게 되었을 것이다. 지금이라도 구현해 놓았으니까 후에 이 프로젝트를 더 해 나아갈때에 피로감이 덜 할것 같다.
//워크스페이스 생성
async function createWorkSpace(req, res, next) {
try {
const existWorkSpace = res.locals.workSpace;
const user = res.locals.User;
const { workSpaceName } = req.body;
if (existWorkSpace) {
return res
.status(400)
.send({ errorMessage: "이미 존재하는 이름입니다." });
}
const createdWorkSpace = await workSpace.create({
owner: user.userEmail,
name: workSpaceName,
});
const addedOwner = await member.create({
memberEmail: user.userEmail,
memberName: user.userName,
workSpace: workSpaceName,
});
return res.status(201).json({createdWorkSpace, addedOwner});
} catch (err) {
console.log(err);
res.status(400).send({
errorMessage: "요청한 데이터 형식이 올바르지 않습니다.",
});
}
}
위 코드의 테스트코드
describe("워크스페이스 생성", () => {
beforeEach(() => {
res.locals.User = localsUser;
res.locals.existWorkSpace = localsWorkSpace;
});
it("createWorkSpace는 함수이다.", () => {
expect(typeof workSpaceController.createWorkSpace).toBe("function");
});
it("workSpace.create와 member.create는 다음과 같은 내용을 호출해야한다.", async () => {
const { workSpaceName } = { workSpaceName: newWorkSpace.name };
await workSpaceController.createWorkSpace(req, res, next);
expect(workSpace.create).toBeCalledWith({
owner: localsUser.userEmail,
name: workSpaceName,
});
expect(member.create).toBeCalledWith({
memberEmail: localsUser.userEmail,
memberName: localsUser.userName,
workSpace: workSpaceName,
});
});
it("이미 같은 이름의 워크스페이스가 존재하는 경우", async () => {
res.locals.workSpace = { name: "existWorkSpace", owner: "existOwner" };
await workSpaceController.createWorkSpace(req, res, next);
expect(res.statusCode).toBe(400);
expect(res._getJSONData()).toStrictEqual({
errorMessage: "이미 존재하는 이름입니다.",
});
});
it("201 응답코드를 반환한다.", async () => {
await workSpaceController.createWorkSpace(req, res, next);
expect(res.statusCode).toBe(201);
expect(res._isEndCalled).toBeTruthy();
});
it("다음과 같은 json 응답값을 받아야 한다.", async () => {
const createdWorkSpace = newWorkSpace;
const addedOwner = {
memberEmail: localsUser.userEmail,
memberName: localsUser.memberName,
workSpace: newWorkSpace.name,
};
workSpace.create.mockReturnValue(createdWorkSpace, addedOwner);
await workSpaceController.createWorkSpace(req, res, next);
expect(res._getJSONData()).toStrictEqual(
{ createdWorkSpace },
{ addedOwner }
);
});
});
워크스페이스 관련 유닛 테스트코드 😉
멤버 관련 유닛 테스트코드 🤟
'항해99 일지' 카테고리의 다른 글
95/99 면접 준비하기(1) (0) | 2022.08.12 |
---|---|
95/99 멈춰 있다면 (0) | 2022.08.09 |
84/99 Socket 중복 생성 트러블 슈팅 (0) | 2022.08.01 |
77/99 실전프로젝트 막바지 코드 리팩토링 (0) | 2022.07.24 |
74/99 도커 빌드 (맥 - ubuntu 호환) / nginx이용 https (실패) (0) | 2022.07.21 |