댓글 라우터 (create) : postId가 null이라고 자꾸 떠서 생각해봤더니 경로를 index.js에 post랑 다르게 두느라고 comment.route.js에 경로에 postId가 없었다. 그래서 수정해줌
레파지토리에 없는 함수를 쓰려고 해서 에러가났다. 레파지토리에 함수를 추가해주고 해당 함수를 사용하는 쪽으로 수정했다.
테스트 코드
: 작성한 코드에 문제가 없는지 테스트하기 위해 작성하는 코드
Testing shows the presence of defects, not their absence
테스팅은 결함이 없는것이 아니라, 결함의 존재를 보여주는것이다.
종류
단위 테스트 (Unit Test): 가장 작은 규모의 기능을 테스트
통합 테스트 (Integration Test): 여러가지 기능을 합쳤을때 생기는 문제를 방지하기 위한 테스트
E2E 테스트 (End-to-end Test): 끝에서 끝(종단 간)을 의미. 백엔드부터 시작해서 최종적으로 웹 페이지가 원하는대로 동작하며 원하는 데이터를 잘 보여주는지 확인
테스팅 프레임워크 Jest
npm init -y
npm i jest -D
// package.json
{
...
"scripts": {
"test": "jest"
},
...
}
// validation.js
module.exports = {
isEmail: (value) => {
// value가 이메일 형식에 맞으면 true, 형식에 맞지 않으면 false를 return 하도록 구현해보세요
return false;
},
};
Layered Architecture Pattern 테스트 코드
npm i jest supertest -D
// jest.config.js
module.exports = {
// 해당 패턴에 일치하는 경로가 존재할 경우 테스트를 하지 않고 넘어갑니다.
"testPathIgnorePatterns": ["/node_modules/"],
// 테스트 실행 시 각 TestCase에 대한 출력을 해줍니다.
verbose: true,
}
// package.json
{
...
"scripts": {
...
"test": "NODE_ENV=test jest --forceExit",
"test:silent": "NODE_ENV=test jest --silent --forceExit",
"test:coverage": "NODE_ENV=test jest --coverage --forceExit",
"test:unit": "NODE_ENV=test jest __tests__/unit --forceExit",
"test:integration": "NODE_ENV=test jest __tests__/integration --forceExit"
},
...
}
대표적인 Jest CLI Options
--forceExit:
테스트 코드 검사가 완료되었을 때, 강제로 Jest를 종료
express의 app 객체와 Sequelize 연결이 Connect상태로 남아있어 테스트 코드가 종료되지 않을 때 사용
--silent:
테스트 코드를 실행했을 때, console.log와 같은 메시지를 출력하지 않음
--coverage:
테스트 코드 검사가 완료된 후 현재 프로젝트의 테스트 코드 커버리지를 출력
--verbose:
테스트 코드의 개별 테스트 결과를 표시
자주 사용하는 Jest 문법
expect 결과값 검증하기
.toBe(value): 입력받은 결과값과 동일한지 비교 (엄격)
.toEqual(value): 입력받은 결과값과 동일한지 비교
.toMatch(regexp | string): 입력받은 결과값과 문자열이 같은지 검증
.toBeTruthy(): 결과값이 True인지 검증
.toBeInstanceOf(Class): 입력받은 값과 Class가 동일한 Instance인지 검증/ Error를 검증할 때 주로 사용
.toHaveProperty(keyPath, value?): 입력받은 객체의 Key와 Value가 일치하는지 검증
.toMatchObject(object): 결과값의 객체와 입력받은 객체가 일치하는지 검증/ 만약 입력받은 객체에서 없는 속성이 있더라도 일치하게끔 연결
Global Jest 문법
afterAll(fn, timeout): 모든 test()가 완료된 이후에 수행/ 테스트가 완료된 이후 DB에 변경된 데이터를 삭제하거나 Mock을 초기화 하기 위해 사용
afterEach(fn, timeout): test()가 완료된 이후에 수행/ 테스트코드가 완료된 이후 Mock 또는 변경된 전역 변수를 초기화할 때 사용
beforeAll(fn, timeout): 테스트 코드가 실행되기 전 가장 처음 수행/ DB의 데이터를 초기화하거나 전역 Mock을 초기화할 때 사용
beforeEach(fn, timeout): test()가 실행되기 전에 수행/ 테스트가 실행되기 전, 동일한 설정을 반복해야할 때 사용
Mock Functions
mock: 특정 Method를 Mocking하기 위해 사용/ 테스트에서 시간 또는 비용이 많이들거나 의존성이 있는 코드를 실제로 실행하지 않고 호출 여부, 입력한 값의 일치 여부와 같은 정보를 확인하기 위해 사용하는 가짜 객체
자주 사용하는 Mock expect 문법
.toHaveBeenCalledTimes(number): Mock이 몇번 호출되었는지 검증
.toHaveBeenCalledWith(arg1, arg2, ...): 어떤 인자를 이용해 Mock이 호출되었는지 검사
의존성 주입(DI: Dependency Injection)
하나의 객체가 다른 객체에게 의존성을 제공하는 방법