개발일지

개발일지 52일차

index.ys 2023. 5. 16. 03:26

jest로 테스트 코드 작성하기

const FollowerController = require("../../../controllers/follower.controller");

mock함수 정의

//service계층에서 사용하는 메소드 가짜(mock) 함수 정의
let mockFollowersService = {
    getFollowerAll: jest.fn(),
    postFollower: jest.fn(),
    deleteFollower: jest.fn()
}

req로 전달받는 값 mock객체 정의

let mockRequest = {
    body: jest.fn(),
};

res로 전달받는 값 mock객체 정의

let mockResponse = {
    status: jest.fn(),
    json: jest.fn(),
};

실제 controller계층 선언

let followerController = new FollowerController();
followerController.followerService = mockFollowersService;

유닛 테스트 선언

describe("팔로워 컨트롤러 계층 유닛 테스트", () => {
    // 각 test가 실행되기 전에 실행됩니다.
    beforeEach(() => {
        jest.resetAllMocks(); // 모든 Mock을 초기화합니다.

        // mockResponse.status의 경우 메서드 체이닝으로 인해 반환값이 Response(자신: this)로 설정되어야합니다.
        mockResponse.status = jest.fn(() => {
            return mockResponse;
        });
    });

1. 팔로워 컨트롤러 postFollower 메소드 성공 테스트

  test("팔로워 컨트롤러 postFollower 메소드 성공 테스트", async () => {
  
  		//임의의 Body 값 할당
        const postFollowerRequestBody = {
            user_id: 1
        };

		//mockbody에 임의의 body값 할당
        mockRequest.body = postFollowerRequestBody;

		//요청이 성공했을때 응답 값 선언
        const postFollowerReturnValue = { "message": "팔로워 추가 완료" };

		//mockFollwersService계층의 postFollower 메소드를 실행 했을때, postFollwerReturnValue 실행
        mockFollowersService.postFollower = jest.fn(() => postFollowerReturnValue);

		//followerController.postFollower 실행시 mockReq, mockRes선언
        await followerController.postFollower(mockRequest, mockResponse);

        //mockFollowersService.postFollower 요청 횟수
        expect(mockFollowersService.postFollower).toHaveBeenCalledTimes(1);
		//mockFollowersService.postFollower 호출시 요청하는 값
        expect(mockFollowersService.postFollower).toHaveBeenCalledWith(
            postFollowerRequestBody.user_id,
        );

        //mockFollowersService.postFollower 요청 횟수
        expect(mockResponse.status).toHaveBeenCalledTimes(1);
        //mockFollowersService.postFollower 호출 횟수
        expect(mockResponse.status).toHaveBeenCalledWith(200);
        //mockFollowersService.postFollower 응답 값
        expect(mockResponse.json).toHaveBeenCalledWith({
            "message": "팔로워 추가 완료"
        });
    });

2. 팔로워 컨트롤러 getFollwerAll 메소드 성공 테스트

test("팔로워 컨트롤러 getFollwerAll 메소드 성공 테스트", async () => {
		//
        const getFollwerAllReturnValue = {
            follow: [
                {
                    follow_id: 1,
                    user_id: 1,
                    follower_name: "kim_cool",
                    createdAt: "2022-07-25T07:45:56.000Z",
                    updatedAt: "2022-07-25T07:52:09.000Z",
                },
                {
                    follow_id: 2,
                    user_id: 1,
                    follower_name: "kim_cool",
                    createdAt: "2022-07-25T07:45:56.000Z",
                    updatedAt: "2022-07-25T07:52:09.000Z",
                },

            ]
        }

        const getFollwerAllRequestBody = {
            user_id: 1,
        };
        mockRequest.body = getFollwerAllRequestBody

        mockFollowersService.getFollowerAll = jest.fn(
            () => getFollwerAllReturnValue
        );

        await followerController.getFollowerAll(mockRequest, mockResponse);

        expect(mockFollowersService.getFollowerAll).toHaveBeenCalledTimes(1);
        expect(mockResponse.status).toHaveBeenCalledTimes(1);
        expect(mockResponse.status).toHaveBeenCalledWith(200);
        expect(mockResponse.json).toHaveBeenCalledWith({ follow: getFollwerAllReturnValue });
    });

3. 팔로워 컨트롤러 deleteFollower 메소드 성공 테스트

  test("팔로워 컨트롤러 deleteFollower 메소드 성공 테스트", async () => {
        const deleteFollowerRequestBody = {
            user_id: 1
        };

        mockRequest.body = deleteFollowerRequestBody

        const deleteFollowerReturnValue = { "message": "팔로우 취소 완료" };

        mockFollowersService.deleteFollower = jest.fn(() => deleteFollowerReturnValue);


        await followerController.deleteFollower(mockRequest, mockResponse);

        expect(mockFollowersService.deleteFollower).toHaveBeenCalledTimes(1);
        expect(mockFollowersService.deleteFollower).toHaveBeenCalledWith(
            deleteFollowerRequestBody.user_id
        );

        expect(mockResponse.status).toHaveBeenCalledTimes(1);
        expect(mockResponse.status).toHaveBeenCalledWith(200);
        expect(mockResponse.json).toHaveBeenCalledWith({
            "message": "팔로우 취소 완료",
        });
    });