5. Create 통합 테스트

우동이·2022년 1월 9일
0

NodeServer Test

목록 보기
6/6
post-thumbnail

통합 테스트란?

  • 모듈을 통합하는 단계에서 수행하는 테스트
  • 먼저 단위 테스트를 수행하여 잘 작동하는지 확인한 후 이 모듈들을 연동해서 테스트를 수행합니다.
  • 모듈들의 상호 작용이 잘 이루어지는지 검증합니다.
  • 통합하는 과정에서 발생하는 오류를 검출합니다.
  • SuperTest 모듈을 이용해 통합 테스트를 쉽게 구현할 수 있습니다.
import request from "supertest";
import moongose from "mongoose";
import app from "../../src/server";
import newProduct from "../data/new-product.json";

it("POST /api", async () => {
  // body 값과 함께 request 요청
  const response = await request(app).post("/api").send(newProduct);

  expect(response.statusCode).toBe(201);
  expect(response.body.name).toBe(newProduct.name);
  expect(response.body.description).toBe(newProduct.description);
  expect(response.body.price).toBe(newProduct.price);
});

// 모든 테스트가 끝나면 몽고DB 커넥션 종료
afterAll(async () => {
  await moongose.connection.close();
});

에러 처리를 위한 통합테스트

  • Node Express는 미들웨어에서 에러가 발생되면 에러 처리기로 전송합니다.
    • 즉 바로 보내주기 때문에 다음 실행할 미들웨어는 실행되지 않습니다.
  • 에러 처리기는 4개의 인자를 가진 미들웨어 입니다.
// 미들웨어
app.get('*', (req, res, next){
  // 에러 처리기로 에러 전송
	throw new Error('Error 발생!')
})

// 에러 처리기
app.use((error, req, res, next){
	res.json({message: error.message});
})
  • 하지만 비동기 처리에서 발생하는 에러는 에러 처리기에서 에러를 받을 수 없게 됩니다.
// 미들웨어
app.get('*', (req, res, next){
  // 에러 처리기로 에러 전송 실패 => 서버 다운
  setImmediate(()=> { throw new Error('Error 발생!') })
	
})

// 에러 처리기
app.use((error, req, res, next){
	res.json({message: error.message});
})
  • 비동기 과정에서는 next()함수의 인자로 넣어주면 해결할 수 있습니다.
// 미들웨어
app.get('*', (req, res, next){
  // 에러 처리기로 에러 전송 가능
  setImmediate(()=> { next(new Error('Error 발생!')); })
	
})

// 에러 처리기
app.use((error, req, res, next){
	res.json({message: error.message});
})
  • server.ts에 에러 핸들러 추가
import express, { Request, Response, NextFunction } from "express";
import moongose from "mongoose";
import router from "./routes";

const url =
  "mongodb://localhost:27017/products?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false";

moongose
  .connect(url)
  .then(() => console.log("mongoDB Connected..."))
  .catch((err) => console.log(err));

const app = express();
app.use(express.json());
app.use("/api", router);

// 에러 핸들러
app.use((err: any, req: Request, res: Response, next: NextFunction) => {
  res.status(500).json({ message: err.message });
});

export default app;
  • 실제 통합 테스트 작성
it("should return 500 on POST /api", async () => {
  // 에러 발생을 위해 잘못된 body 값을 전송합니다.
  const response = await request(app).post("/api").send({ name: "computer" });

  const errorMessage =
    "Product validation failed: description: Path `description` is required.";

  expect(response.statusCode).toBe(500);

  expect(response.body).toStrictEqual({
    message: errorMessage,
  });

참고

  • 따라하며 배우는 TDD 개발 ( John Ahn )
profile
아직 나는 취해있을 수 없다...

0개의 댓글