
supertest는 노드의 http 서버를 테스트하는 모듈이다. 통합테스트를 통하여 createProduct가 DB와 함께 잘 작동하는지 확인할 수 있다.
supertest를 import해서 server.js에 정의된 app을 인자로 넣어주어야한다.
test('POST /api/products', async() => {
const response = await request(app)
.post("/api/products")
.send(newProduct)
expect(response.statusCode).toBe(201)
expect(response.body.name).toBe(newProduct.name)
expect(response.body.description).toBe(newProduct.description)
})
post 메서드로 해당 경로에 요청을 보내는데, 이때 request body에 값을 넣어줄 수 있다. 단위테스트와 동일하게, expect - matcher 구조로 확인해준다.
통합테스트는 단위테스트와 다르게 app이 실행되기 때문에 server.js에 달아놓은 log도 함께 찍힌다. Database도 연동된 것이 보인다.

앞서 만들어둔 Error handling도 유사하게 작성해주면된다.
test('should return 500 on POST /api/products when required property missing', async () => {
const response = await request(app)
.post("/api/products")
.send({name: "Phone"})
expect(response.statusCode).toBe(500)
console.log(response.body);
expect(response.body).toStrictEqual({message:""})
})
필수값인 description 없이 요청을 보내면 상태코드 500으로 서버 에러를 리턴한다. 에러메시지가 제대로 왔는지 확인하기 위하여 toStrictEqual matcher로 response의 body를 확인해준다. 그런데 막상 어떤 메시지가 오는지 로그를 확인해보면 아무것도 없다.

에러핸들링 함수가 제대로 동작하지 않고 있는 것이다. 즉, 콜백함수 next에서 에러핸들러를 호출해주어야한다. server.js에 error handler middleware를 추가한다.
app.use((error,req,res,next)=>{
res.status(500).json({message:error.message})
})
이제 다시 테스트를 돌려보면 에러메시지가 정상적으로 전달된다.

이제 알아낸 에러메시지를 통합테스트에 넣어주면 단위테스트와 통합테스트 모두 잘 통과한다.
