인프런 커뮤니티 질문&답변

Highballs님의 프로필 이미지
Highballs

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

Jest 테스트 코드 작성 관련 질문

작성

·

486

0

타입스크립트로 Jest 테스트 코드를 작성해보고 있는데요.

 

유닛테스트를 작성하여, 직접 작성한 미들웨어에서 next() 함수가 호출되는지 확인해보려고 합니다.

 

class-validator로 req.body가 number인지 검증하는 미들웨어이고,

 테스트코드는 다음과 같습니다.

import 'reflect-metadata';
import { CreateCheckInDto } from '../check-in/create-check-in.dto';
import { validation } from './validation.middleware';

describe('validation middleware', () => {
  it('simple test', () => {
    const req: any = {
      body: { cardId: '22' },
    };
    const res: any = {};
    const next = jest.fn();

    validation(CreateCheckInDto)(req, res, next);

    expect(next).toBeCalledTimes(1);
  });
});
 

미들웨어 코드는 다음과 같습니다(class validator로 req.body를 검증하는 코드입니다). 

 

import { plainToInstance } from 'class-transformer';
import { validate, ValidationError } from 'class-validator';
import { NextFunction, Request, Response, RequestHandler } from 'express';

export function validation(type: any): RequestHandler {
  return (req: Request, res: Response, next: NextFunction) => {
    validate(plainToInstance(type, req.body)).then(
      (errors: ValidationError[]) => {
        if (errors.length > 0) {
          res.redirect('redirect');
        } else {
          console.log('nextttttttttttttttt');
          next();
        }
      },
    );
  };
}

 

console.log('nextttttttttttttttt');

 

이게 콘솔로그로 찍히는 걸보면 next()부분까지 도달하는 것 같은데 테스트 결과는 기대와 다르게 아래와 같습니다.

  console.log
    nextttttttttttttttt

      at src/middleware/validation.middleware.ts:12:19

 FAIL  src/middleware/validation.middleware.spec.ts
  validation middleware
    ✕ simple test (22 ms)

  ● validation middleware › simple test

    expect(jest.fn()).toBeCalledTimes(expected)

    Expected number of calls: 1
    Received number of calls: 0

      13 |     validation(CreateCheckInDto)(req, res, next);
      14 |
    > 15 |     expect(next).toBeCalledTimes(1);
         |                  ^
      16 |   });
      17 | });
      18 |

      at Object.<anonymous> (src/middleware/validation.middleware.spec.ts:15:18)


왜 received number of calls가 0이 나오는지 실마리를 찾지 못하여 질문으로 올립니다.

원인해결을 위한 키워드라도 실마리를 주신다면 정말 감사하겠습니다!

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

비동기여서 그렇습니다. then보다 테스트가 먼저 끝납니다. 테스트가 프로미스가 끝나고 실행되도록 기다리는 방법이 핕요합니다.

return validate... 한 뒤에 await같은 것을 붙여서요.

Highballs님의 프로필 이미지
Highballs

작성한 질문수

질문하기