본문 바로가기
개발/NestJS

TypeError: Class extends value undefined is not a constructor or null

by coking 2022. 9. 27.

NestJS에서 테스트 코드를 작성하다가 발생한 에러이며 내가 발생한 상황에 대한 글은 하나도 없어서
나 같은 어려움을 겪고 있는 분들을 돕고자 작성한다!

 

회사 코드에 테스트 코드를 적용하기 위해 공부하면서 적용하던 중 에러를 만나게 되었는데 처음에는 도무지 감이 잡히지 않았으나
회사 코드를 다시 파악하던 중 나는 상속이 문제일 거 같다는 가설을 내리고 문제를 해결하려고 했다. 

일단 이해를 위한 회사 엔티티 설계를 보여주려고 한다. 

 

나 같은 경우는 엔티티에 공통으로 들어가는 것들을 편하게 작업하기 위해서 밑에 이미지와 같이 모든 엔티티에 반영될 생성일, 업데이트일, 삭제일을 공통 엔티티로 따로 빼서 상속을 하는 편이고 

 

또한 생성될 때 누가 만들었는지 가 중요한 엔티티에서는 이렇게 다른 작성자가 같이 들어간 엔티티를 만들어 상속받아 사용했다. 

여기서 문제가 발생하는 게 writer는 user엔티티의 userId를 사용하는데 문제는 user엔티티는 첫 이미지에 있는
BaseModel을 상속한다는 것이다. 

 

user 엔티티 코드

일반 엔티티 중에 작성자가 필요한 엔티티는 WriterBaseModel을 상속받는 데 그 안에 존재하는 writer에 사용되는 user는 BaseModel을 상속받으니 jest는 BaseModel을 추척 할 수 없겠다 라는 생각까지 해서 해결 법을 찾으려 했으나 거의 4일 정도를 다른 개발자 분과 구글링을 하고 nest 공식 디스코드에 문의하고 다 해보았으나 제대로 된 해답을 찾지 못했다.

 

그러다가 갑자기 순환 참조 방지를 위해 적용하는 forwardRef를 testCode내부에 적용해 봐야겠단 생각이 들었다 왜냐하면 지금 발생하는 문제가 실제 코드가 돌아가는 환경에서는 발생하지 않았고 테스트 코드에서만 발생하는 문제이니 밖에 코드를 계속 바꾸는 행위는 의미 없다고 생각했고, 근본적으로 user엔티티만 내가 작성하는 테스트 코드에서 참조할 수 있다면 근본적으로 해결할 수 있을 거라 생각했고 결과는 해결했다!!

 

 

내 예상대로 jest에서 테스트를 생성하는 모듈이 이를 직접 인지하지 못해서 발생하는 에러였고 userd엔티티를 
import 하면서 에러가 해결되었다. 
내가 해본 결과 forwardRef를 사용하지 않아도 정상 작동되는데 혹시나 jest 모듈에서 참조 에러가 발생할 것을 대비해 그대로 남겨둔다.

 

 

그리고 제일 좋은 건 저런 엔티티 상속 구조를 만들지 않는 것이니 혹시 처음 보시는 분들은 따라하지 마세요!!

 

  

댓글