작성
·
487
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같은 것을 붙여서요.