순서

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 에 에러값을 넣어주면 비동기 요청에 대한 에러를 잘처리 할 수 있는 곳으로 보내준다.
    }
};

+ Recent posts