Project

테스트코드 작성하기

tuigun 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를 리턴하기 때문에 테스트코드와 불일치한다.

 

와 벌써 테스트코드의 유익함을 깨달아버렸다.