TypeError: user_model_1.default.create is not a function
253
13 asked
학습중 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() 부분에서 에러가 나는것으로 확인되었습니다.
Answer 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 메서드가 화살표 함수로 선언되어 있는데, 이 부분도 필요에 따라 일반 함수 선언으로 변경할 수 있습니다. 하지만 이 부분은 에러와 직접적인 관련이 없기 때문에 의도한대로 사용하시면 됩니다.
에러 처리를 위한 단위테스트 작성
0
344
1
res.status(201) 부분에서 typeerror가 발생합니다
0
387
1
따라하며 배우는 TDD 개발 [2023.11 업데이트] 강의 질문
0
333
1
[MAC] PORT:5000번 관련 에러
0
272
0
테스트를 위한 데이터베이스를 생성해야하나요?
0
401
1
Postman 사용방법에 대해서
0
400
1
jest.fn() 을 할당할때 타입스크립트에서 에러가 발생합니다.
0
443
1
라우터를 돌릴 때
0
352
1
npm run start를 실행할 때 부터가 이상합니다.
1
431
1
node.js에 대한 이상점
0
453
1
nodemocks 오류나니까 뺴고 설치하셔요
1
409
1
Node.js 앱을 테스트하기 위한 Jest 설정 부분..
0
271
0
models 파일만 첫번째 글자를 대문자로 해주는 이유
0
297
1
mongodb project 및 cluster관련
0
327
0
무조건 failure case 로 넘어가시는 분들
2
258
1
올려둔 ES6 Express Jest Boilerplate Template 으로 개발 중이신 분들...
0
236
0
ES6 사용하고 싶은 분들...
1
359
0
Jest did not exit one second after the test run has completed. 이슈
0
3039
3
왜 인자네개 함수 안만들어도 포스트맨에서는 에러메세지가 나오는 것인가요?
0
300
2
통합 테스트에 관한 질문 이 있습니다.
0
238
1
bodyParser 대체에 관한 질문
0
418
2
Cannot log after tests are done. Did you forget to wait for something async in your test?
0
2118
1
안녕하세요. 문의드립니다.
0
199
1
mock 사용 관련
0
161
0

