상권's

TIL 64 (BookDam server TestCode Error) 본문

~2022 작성 글/TIL

TIL 64 (BookDam server TestCode Error)

라마치 2022. 2. 26. 23:20

오늘은 코드스테이츠 수강 중에 개인적으로 학습했던 TDD(Supertest) 복습하면서 북담의 테스트 코드를 만들어보다가 맞이한 에러에 대해서 알아보겠습니다.

 

지난 주 목요일부터 supertest  복습하고 코드를 구현했습니다. describe나 it은 잘 구현했었는데 before로 테스트용 데이터를 넣는 부분에서 고생을 했습니다. TDD 학습을 인프런의 김정환님 강의로 했었는데 강의에서는 Sequelize cli가 아닌 define으로 테이블을 정의했습니다.

const app = require('../app');
const request = require('supertest');
const models = require('../models');
const should = require('should');
const { User: UserModel, Article: ArticleModel, Follow: FollowModel } = require('../models');

describe('POST /user/login', () => {
  describe('성공 시', () => {
    before(() => models.sequelize.sync({ force: true }));
    before(() => UserModel.queryInterface.bulkInsert('Users', [{

먼저 models/index.js를 통해서 데이터베이스를 sync 시켜주었고 테이블들을 불러왔습니다. 근데 아직 해소를 하지 못한 궁금증이 있습니다. models 모듈을 불러올 떼 models/index.js 를 안해줘도 sync가 되어서 각 테이블을 불러오는 모듈과 함께 한 줄로 불러오려고 하니 에러가 발생했습니다.

 1) POST /user/login
       성공 시
         "before all" hook for "로그인 성공 시 응답 상태 코드는 200을 반환한다.":
     TypeError: Cannot read properties of undefined (reading 'sequelize')
      at Context.<anonymous> (test/spec.js:9:25)
      at processImmediate (node:internal/timers:464:21)

지금까지 구글링했을 때는 db를 연결하시는 분들이 define해서 sync하고 테이블을 불러오는 글들만 보여서 추가적으로 학습할 예정입니다. 일단은 위의 코드처럼 저렇게 db를 sync 시켰고 각 테이블들을 불러왔습니다.

 

그리고 각 테이블에 테스트할 값들을 넣어주는 코드를 queryInterface로 넣어줬는데 이 부분도 정확하게 구현하는 방법에 대해서 알지는 못해서 더 학습해볼 예정입니다.(구글링해도 확인이 안되서 이것 저것 넣어보다가 성공하게 되었는데.. 정확한 이유를 몰라서 너무 아쉬웠습니다.)

 

다시 본론으로 돌아오면, 오늘 맞이했던 에러는 column 속성 적용하면서 발생했습니다.

분명 각 테이블을 생성할 때 column에 allowNull : false 옵션을 넣어줬는데 테스트를 실행하고 나면 Null에 YES가 나왔습니다. 그러고 migration을 새로하면 다시 Null이 No로 바뀌었습니다.

다시 테스트 코드를 살펴보다가 index.js가 sync 에 사용되는 것을 보고 models 폴더에서 테이블 정의된 것을 확인하니 거기에서는 allowNull 옵션을 추가해주지 않았던 것을 알 수 있었습니다. migration만 하다보니 models에서도 변경해줘야 한다는 걸 까먹었고, 그 결과 sync 때 마다 해당 옵션이 빠진 채로 초기화되었던 것이었습니다.

이후에 models의 테이블 파일에서 allowNull을 추가해주면서 해당 문제를 해결할 수 있었습니다.

 

이렇게 북담 테스트 코드를 구현하면서 맞이한 에러는 다음과 같습니다.

1. db 테이블을 이용하기 위해 모듈을 불러오는 과정에서 models의 sync와 테이블 호출

2. 테스트용 데이터를 넣는 과정에서 queryInterface를 불러오긴 했지만 불분명한 해결 방법

3. migration과 models의 테이블에서 속성 옵션 누락

 

해결은 했지만 아쉬움이 많이 남았습니다. 한편으로는 테스트 코드를 시도했기에 알 수 있었던 에러여서 잘 배웠다고 생각합니다. 더 진행하면서 발생되는 에러도 기록해서 이후에 똑같은 실수를 반복하지 않도록 해야겠습니다.

'~2022 작성 글 > TIL' 카테고리의 다른 글

TIL 66 (렉시컬 환경)  (0) 2022.03.01
TIL 65 (실행 컨텍스트)  (0) 2022.02.27
TIL 63 (var, let, const, 호이스팅)  (0) 2022.02.23
TIL 62 (스코프란)  (0) 2022.02.23
TIL 61 (북담 서버 리팩토링3)  (0) 2022.02.20
Comments