서비스 테스트
왜 때문에 테스트?
- 자신이 만든 서비스가 제대로 동작하는지 테스트해야 한다.
- 아무리 철저하게 테스트해도 에러를 완전히 막을 수는 없음
- 기능이 많다면 수작업으로 테스트하기 힘듦
- 아무리 철저하게 테스트해도 에러를 완전히 막을 수는 없음
- 테스트하면 좋은 점
- 사소한 에러로 인해 프로그램이 고장나는 것을 막을 수 있음
- 프로그램이 자동으로 어떤 부분이 고장나는지 알려줌
프로그램을 테스트하는 프로그램을 만들면 시간을 절약할 수 있다.
테스트하는 습관을 들여두자
Jest 사용하기
npm i jest
- 코드에 spec이 들어가면 테스트로 인식한다.
간단한 테스트 문구
test('1+1은 2입니다',()=>{expect(1+1).toEqueal(3);});
단위 테스트 (유닛 테스트)
별도로 떼어내어 분리 가능한 코드의 테스트를 진행함
const {isLoggedIn, isNotLoggedIn} =require('./middlewares');
describe('isLoggedIn',()=>{
const req={ isAuthernticated : jest.fn(()=>true),
const res={};
const next=jest.fn() //가짜 next
test('로그인되어 있으면 isLoggedIn이 next를 호출해야 함',()=>{
isLoggedIn(req,res,next); //가짜로 만든 값을 넣어서 실행
expext(next).toBeCalledTimes(1); //next가 호출되는지 확인
});
test('로그인되어 있지 않으면 isLoggedIn이 next를 호출해야 함',()->{
const req={ isAuthernticated : jest.fn(()=>true),
isLoggedIn(req,res,next);
expect(res.status).toBeCalledWith(403);
exprect(res.send).toBeCalledWith('로그인 필요');
expext(isNotLoggedIn()).toEqual();
});
}
- 하나의 test 안에 expect가 여러개일 경우 다 만족시켜야 함
컨트롤러 분리
const { addFollowing} = require('./user');
describe('addFollowing', () =>{
const req={};
const res={ send: jest.fn(),};
const next = jest.fn();
test('사용자가 찾아 팔로잉을 추가하고 success를 응답해야 함',async()=>{
await addFollowing(req,res,next);
expect(res.send).toBeCalledWith('success');
});
test('사용자를 못 찾으면 res.status(404).send(no user)를 호출함',async()=>{
await addFollowing(req,res,next);
expect(res.status).toBeCalledWith(404);
expect(res.send).toBeCalledWith('no user');
});
test('DB에서 에러가 발생하면 next(error)호출함',async()=>{
const error = '테스트용 에러';
await addFollowing(req,res,next);
expect(next).toBeCalledWith(error);
});
- 데이터베이스가 들어있을 경우
데이터베이스 모킹
유저 아이디를 이용한 테스트를 진행할 때 에러가 발생한다. 이는 테스트에 데이터베이스 사용이 포함되어있기 때문이다.
사용되는 User.findOne도 가짜를 만들어준다. →모킹
jest.mock("../models/user");
const User = require("../models/user");
User.findOne.mockReturnValue(Promise.resolve({ id: 1, name: "zerocho" }));
//user.findone을 실행하면 무조건 위의 아이디와 이름이 나오게 된다.
- 단위 테스트는 모킹이 핵심이다.