ABOUT ME

-

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

     

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

     

Designed by Tistory.