인프런 커뮤니티 질문&답변

양진영님의 프로필 이미지
양진영

작성한 질문수

따라하며 배우는 TDD 개발 [2023.11 업데이트]

MongoDB 클러스터 생성

TypeError: user_model_1.default.create is not a function

작성

·

145

0

학습중 repository pattern을 적용하여 테스트를 적용해 보던 중 TypeError: user_model_1.default.create is not a function 라는 에러와 마주하게 되었습니다.

user.repository.ts

import User from "../model/user.model";

export class UserRepository {

   

    createUser = async(user) => {
        const newUser = await User.create({
            ...user
        })
        return newUser
    }

    findUserById = async(id:string) => {
        const user = await User.findById('65cba34813b2fbec74a558a8')
        if(!user) throw new Error('존재하지 않는 유저정보 입니다.')
        return user
    }
}


user.repository.test.ts

import { UserRepository } from "../../app/repository/user.repository"


const createMock = jest.fn()
const findByIdMock = jest.fn()
jest.mock("../../app/model/user.model", () => {
    return {
        User: jest.fn(() => {
            return {
                create:createMock,
                findById:findByIdMock
            }

        })
    }
})

describe('user repository Create', () => {
    let sut:UserRepository;

    const newUser = {
        id:"abcdefrwgsf123123",
        name:"test name",
        email:"test@nanana.com"
    }

    beforeEach(() => {
        sut = new UserRepository()
    })

    afterEach(() => {
        jest.clearAllMocks()
    })

    it('create api', async () => {
        createMock.mockReturnValueOnce(newUser)
     
        const actual = await sut.createUser({name:newUser.name, email:newUser.email})

        expect(createMock).toHaveBeenCalledTimes(1)
        expect(actual).toStrictEqual(newUser)
        expect(createMock).toHaveBeenCalledWith({name:newUser.name, email:newUser.email})
    })
})

 

jest실행시 create api의 createMock.mockReturnValue() 까지는 실행이되지만 await sut.createUser() 부분에서 에러가 나는것으로 확인되었습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

사용하신 코드 내용을 살펴보니, User.create 메서드를 사용하는 부분에서 에러가 발생했다고 하셨습니다. jest.mock 사용 방식에 문제가 있는 것으로 보입니다. jest.mock은 모듈 전체를 모킹할 때 사용되며, 그 안에서 default를 사용하셔야 기본 내보내기로 모킹된 함수나 클래스에 접근할 수 있습니다. User 모델의 경우 ES6 모듈의 기본 내보내기(export default)를 사용하고 있으므로, 해당 모듈을 모킹할 때는 default 키를 반드시 사용해야 합니다.

모킹에 사용하신 코드에서 모듈을 반환하는 객체 내부에 User를 키로 사용하셨는데, 여기서 default로 바꿔야 합니다. 아래 코드로 수정해 보시기 바랍니다.

jest.mock("../../app/model/user.model", () => {
    return {
        default: {
            create: createMock,
            findById: findByIdMock
        }
    }
});

수정 후에 테스트를 다시 실행해보시면 TypeError: user_model_1.default.create is not a function 에러가 해결될 것입니다.

그리고, UserRepository 클래스 내 createUser 메서드와 findUserById 메서드가 화살표 함수로 선언되어 있는데, 이 부분도 필요에 따라 일반 함수 선언으로 변경할 수 있습니다. 하지만 이 부분은 에러와 직접적인 관련이 없기 때문에 의도한대로 사용하시면 됩니다.

양진영님의 프로필 이미지
양진영

작성한 질문수

질문하기