통합 테스트란?
- 모듈을 통합하는 단계에서 수행하는 테스트
- 먼저 단위 테스트를 수행하여 잘 작동하는지 확인한 후 이 모듈들을 연동해서 테스트를 수행합니다.
- 모듈들의 상호 작용이 잘 이루어지는지 검증합니다.
- 통합하는 과정에서 발생하는 오류를 검출합니다.
- 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 () => {
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);
});
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});
})
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 () => {
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 )