본문 바로가기
코딩코딩/웹개발

supertest에서 multipart/form-data로 파일 post하는 법, timeout 에러 해결하기

by g0n1 2022. 7. 24.
728x90
describe('/api/card에서는 ', () => {

  /* 명함 생성 테스트 */
  test(
    'POST /create 성공 시 201',
    done => {
      request(app)
        .post('/api/card/create')
        .set('Content-Type', 'multipart/form-data')
        .attach('image', './tests/dummy.png')
        .field('user_id', '9999')
        .field('nickname', '테스트닉네임')
        .expect(201)
        .end(() => {
          done();
        });
    },
    TIMELIMIT,
  );

위와 같이 헤더에서 Content-Type을 명시하고, 첨부파일-attach, 일반 텍스트-field로 form의 내용을 채울 수 있다.

 

 

timeout 에러가 발생했던 코드

describe('/api/card에서는 ', () => {

  /* 명함 생성 테스트 */
  test(
    'POST /create 성공 시 201',
    done => {
      request(app)
        .post('/api/card/create')
        .set('Content-Type', 'multipart/form-data')
        .attach('image', './tests/dummy.png')
        .field('user_id', '9999')
        .field('nickname', '테스트닉네임')
        .then(response => {
          expect(response.statusCode).toBe(201);
          done();
        });
    },
    TIMELIMIT,
  );

나는 다른 테스트들 처럼 then을 쓰면 될 것이라 생각했다.

그런데 test를 local과 github action이든 관계없이 계속 fail해버리는 것이었다...

다른 post나 get은 잘 되었고, 그 post를 복사해온 것이기 때문에 이것도 괜찮을 것이라 생각했다.

 

"음,,, timeout이 발생하니 limit을 올려야겠다!" 라고 생각해 테스트용 정말 작은 이미지도 준비하고, limit을 20배 ~ 100배까지 키워봤다.

그런데 늘리는 족족 30분, 1시간, .. 계속 타임아웃이 났다. 

 

그래서 나는 "아하 DB가 AWS 프리티어에서 돌고 있어서 트랜잭션이 느리구나!" 라고 생각해 AWS ec2.micro에서 돌아가던 DB를 GCP에서 그나마 좀 나은 거로 바꿔봤다. 

결과는 역시 fail.

 

결국 나는 "github action 돌아가는 환경이 느린 것 같으니 젠킨스를 도입해서 괜찮은 VM에서 돌아가게 해야겠다!" 라고 생각했다. -> 이는 정말 바보같은 생각이었다. 내 노트북에서도 안 되는데 컴퓨터 스펙이 좋으면 될 것이라 생각한 것이다... 무슨 GPU라도 달아서 쓰려고 한 건지 바보같다...

 

그리고 limit을 올리는 첫번째 방법을 반복할 즈음,, 내가 요청을 이상하게 하고 있는 게 아닌가 생각했다.

다른 post들에는 send같은 게 있는데 이 post는 send가 없었다... send를 넣어보니 send는 attach나 field랑 같이 쓸 수 없다고 한다. 그래서 뭔가 이상하다 싶었다.

구글링을 해 다른 코드를 살펴보니, then안에서 expect를 쓰는 게 아니고 바로 expect를 쓴다는 것을 확인하고 expect를 then에서 꺼냈더니 테스트가 바로 성공했다 ㅠ

 

728x90

댓글