작성
·
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
메서드가 화살표 함수로 선언되어 있는데, 이 부분도 필요에 따라 일반 함수 선언으로 변경할 수 있습니다. 하지만 이 부분은 에러와 직접적인 관련이 없기 때문에 의도한대로 사용하시면 됩니다.