순서
1. 데이터를 저장할 때 에러가 나는 부분을 파악
2. 에러에 해당되는 부분에 대한 단위 테스트 작성
3. 테스트에 대응하는 실제 코드 작성
(테스트 상황) 비동기 요청에 대한 에러발생
비동기 요청에 대한 결과값
- 성공 : Promise.resolve(value)
- 에러 : Promise.reject(reason)
에러 상황 구현
1. 데이터베이스에서 처리하는 부분은 문제가 없다.
2. 비동기 요청시 에러 발생
// express + jest
const productController = require("../../controller/products");
const productModel = require("../../models/Product");
const httpMocks = require('node-mocks-http');
const newProduct = require('../data/new-product.json');
productModel.create = jest.fn();
let req, res, next;
beforeEach(() =>{
req = httpMocks.createRequest();
res = httpMocks.createResponse();
next = jest.fn(); // 미들웨어 함수를 목 함수로 대체
})
describe('Products Controller', ()=>{
beforeEach(() =>{
req.body = newProduct;
});
it('Should handle errors', async () => {
const errorMessage = {message: 'Description property missing'};
const rejectedPromise = Promise.reject(errorMessage);
productModel.create.mockReturnValue(rejectedPromise) // 에러상황을 생성
await productController.createProduct(req, res, next);
expect(next).toBeCalledWith(errorMessage);
});
});
- next 로 에러를 처리하는 이유 : express에서 비동기 요청에서 발생하는 에러를 받으면 서버가 망가진다. 이 에러를 next를 이용하면 처리가 가능하다.
테스트에 대응하는 실제 코드 작성
const productModel = require('../models/Product');
exports.createProduct = async (req, res, next) => {
try{
const createdProduct = await productModel.create(req.body);
res.status(201).json(createdProduct);
}catch (error) {
next(error); // next 에 에러값을 넣어주면 비동기 요청에 대한 에러를 잘처리 할 수 있는 곳으로 보내준다.
}
};
'TDD > jest' 카테고리의 다른 글
[ jest ] Reflect.getMetadata(metadataKey, target) - 설정된 메타데이터 확인하는 메서드 (0) | 2024.12.02 |
---|---|
[ jest ] mockResolvedValue와 mockReturnValue의 차이 (0) | 2024.12.02 |
[ jest ] toBe vs toEqual vs toStrictEqual 차이점 (0) | 2024.12.01 |
[ jest ] express + jest 기본 설정 (1) | 2024.11.14 |
[ jest ] e2e : Given When Then (0) | 2024.09.08 |