테스트코드 작성하기
그동안 미루고 미뤄왔던; 테스트코드를 작성했다.
나에게 엄청난 장벽이 느껴졌던 테스트코드인데,
직접 작성해보니 또 그렇게 엄청난!! 어려움을 가진 무언가는 아닌듯도 하고..?(경거망동)
또, 테스트코드는 내 코드의 결함을 보여준다는 의미라고하는데 사실 아직 무슨 말인지 잘 와닿지 않았었는데,
아니 이걸 보면 내 코드의 결함이 보인다고?..하는 의구심을 품었지만
역시 백문의불여일타라고, 직접 해보니까 알겠다. 내 코드의 이상한 부분을;;
테스트코드를 짜다보면 안보려고해도 ... 보일 것 같다.
((그리고 고치지 못해 괴로운 나.. 보인다..보여..))
오늘은 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를 리턴하기 때문에 테스트코드와 불일치한다.
와 벌써 테스트코드의 유익함을 깨달아버렸다.