-
테스트코드 작성하기Project 2021. 8. 8. 04:55
그동안 미루고 미뤄왔던; 테스트코드를 작성했다.
나에게 엄청난 장벽이 느껴졌던 테스트코드인데,
직접 작성해보니 또 그렇게 엄청난!! 어려움을 가진 무언가는 아닌듯도 하고..?(경거망동)
또, 테스트코드는 내 코드의 결함을 보여준다는 의미라고하는데 사실 아직 무슨 말인지 잘 와닿지 않았었는데,
아니 이걸 보면 내 코드의 결함이 보인다고?..하는 의구심을 품었지만
역시 백문의불여일타라고, 직접 해보니까 알겠다. 내 코드의 이상한 부분을;;
테스트코드를 짜다보면 안보려고해도 ... 보일 것 같다.
((그리고 고치지 못해 괴로운 나.. 보인다..보여..))
오늘은 auth-middleware에 대해서만 테스트코드를 작성했지만,
앞으로 점점 테스트코드를 많이 써보려고한다.
이전에 했던 프로젝트에 테스트코드를 덧입히고 있지만,
다음엔 TDD방식으로 간단한 CRUD라도 구현해보고싶다.
jest를 이용해 테스트코드를 작성했다.
auth-middleware.js
const jwt = require("jsonwebtoken"); const { User } = require("../schema/user"); require("dotenv").config(); exports.authMiddlesware = (req, res, next) => { try { const { access_token } = req.headers; const { email } = jwt.verify(access_token, process.env.SECRET_KEY); const { kakaoId } = jwt.verify(access_token, process.env.SECRET_KEY); if (email != undefined) { User.findOne({ email }).then((user) => { res.locals.user = user; next(); }); } else { User.findOne({ kakaoId }).then((user) => { res.locals.user = user; next(); }); } } catch (error) { res.json({ msg: "not_login", }); return; } };
auth-middleware.spec.js
const { authMiddlesware } = require("./auth-middleware"); jest.mock("../schema/user"); const { User } = require("../schema/user"); test("정상적인 토큰을 넣은 경우 User.findOne이 실행된다.", () => { User.findOne = jest.fn(); authMiddlesware( { headers: { access_token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZW1haWwiOiJzYW1wbGUiLCJpYXQiOjE1MTYyMzkwMjJ9.C-GELIUg65fKPFyHbZkq5phaj9Kh2YKRAzEsk4iFD3E", }, }, { locals: {}, json: () => {}, } ); expect(User.findOne).toHaveBeenCalledTimes(1); expect(User.findOne).toHaveBeenCalledWith({ email: "sample" }); }); test("변조된 토큰으로 요청한 경우, not_login이라는 에러 메시지가 뜬다.", () => { const mockedJson = jest.fn(); authMiddlesware( { headers: { access_token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.cq-uoLxOu3V4RjxnbUAFZ36aSZ24BXiAH8RFDYVA6XU", }, }, { locals: {}, json: mockedJson, } ); expect(mockedJson).toHaveBeenCalledWith({ msg: "not_login", }); });
백문이 불여일타..
첫번째 테스트케이스 중, ` toHaveBeenCalledWith ` 메서드를 사용한 부분에서,
사실 나는 user.findOne 하면, ' sample ' 만 반환할 줄 알았는데, 자꾸 { email : "sample" }을 반환하는 나의 코드..
` auth-middleware.js `를 확인해보니,
` user.findOne({email}) ` 이런식으로 curly brace를 먹여서 찾고있었기 때문에 일어난 일이란 걸 알았다..
해당 코드에서 {eamil}로 찾으면 javascript는 object를 리턴하기 때문에 테스트코드와 불일치한다.
와 벌써 테스트코드의 유익함을 깨달아버렸다.
'Project' 카테고리의 다른 글
크리스마스 해커톤 후기 (0) 2021.12.28 [리팩토링] socket.js 코드 분리하기 (0) 2021.08.05 [리팩토링] 챗봇 추가하기 (4) 2021.07.25 [리팩토링] 유저 가입 코드 수정 (0) 2021.07.15 [OKU] 유효성 검사는 어디에서 발생하는가? (0) 2021.07.02