단위(unit) 테스트란
개발 초기단계에서 클래스의 메서드를 하나씩 점검하기 위해
테스트만을 위한 코드를 작성하는 것을 '단위(unit) 테스트'라고 말합니다
(메서드가 잘 호출되는지, 오류는 없는지...)
단위 테스트는 수정 비용을 줄이는 데 도움이 됩니다
Meta사(구 facebook)에서 만든 테스팅용 프레임워크입니다
최소한의 설정으로 동작하며, 단위 테스트를 위해 이용할 수 있습니다
1) 설치
npm install -D jest node-mocks-http supertest
(-D: Development)
2) package.json을 수정합니다
"scripts": {
"test": "jest --verbose"
},
//or verbose 옵션을 넣은 config 파일을 따로 생성했을 경우 (-c는 config의 약자)
"scripts": {
"test": "jest -c jest.config.unit.js"
},
3) jest 실행
npm run test
파일명.test.js <- jest
가 알아서 실행합니다
4) jest Runner 익스텐션 설치
(하나의 테스트코드만 실행하기 위해 사용합니다)
describe('controller', ()=>{
const service = {}
it('userController getProfile', ()=> {
})
})
describe('service', ()=>{
const b = 1
})
describe
, it
, test
는 코드를 실행할 영역을 분류하기 위한 함수입니다
함수 자체에 별다른 기능이 담겨있지는 않습니다
테스트 코드 작성과 실행을 습관화합시다...선 에러 후 조치
테스트 코드 작성시 실행 결과가 어떠한 리턴값을 뱉을 지 머릿속에서 파악하고 있어야 의미를 가집니다
(expect와 toBe의 결과 / toBe('object')...)
많은 개발지식이 필요...
jwt.test.js
const sum = (a, b) => a + b;
const obj = {
userid: "web7722",
userpw: "1234",
};
describe("JWT 클래스 테스트 코드", () => {
it("decode", () => {
console.log("Hello");
});
it("encode", () => {});
it("2+2=4", () => {
const result = sum(2, 2);
expect(result).toBe(3); // expect(received).toBe(expected)...1 failed
expect(result).toBe(4);
});
it("object test", () => {
expect(obj).toEqual({
userid: "web7722",
});
});
});
백엔드용 예제 코드입니다
user.reposritory.test.js
const jestConfigUnit = require("../../jest.config.unit");
const UserRepository = require("./user.repository");
describe("UserRepository", () => {
let User, repository;
// beforeEach : 모든 it 함수가 실행될 때마다 바로 직전에 실행될 메서드입니다
beforeEach(() => {
User = {
// 실제 모델이 아닌 테스트용도로 사용할 객체입니다
create: jest.fn().mockResolvedValue({}),
// jest.fn : jest가 제공하는 테스트용 가짜 함수, 리턴값도 임의로 만들 수 있습니다(mockResolvedValue)
};
repository = new UserRepository({ User });
console.log(repository); // UserRepository: { User: {...} }
});
it("UserRepository를 잘 가져오는지", () => {
expect(typeof UserRepository).toBe("function");
});
describe("addUser", () => {
let payload = {
userid: "web7722",
userpw: "1234",
username: "user1",
};
it("[try] addUser 메서드 확인", async () => {
const user = await repository.addUser(payload);
expect(User.create).toHaveBeenCalledWith(
// 인자값 전달이 필요합니다
payload,
{ raw: true }
);
expect(user).toEqual({}); // 프로미스 객체와 빈 객체는 당연히 다릅니다..
});
it("[catch] create 메서드 실행결과 reject 발생시", async () => {
User.create = jest.fn().mockRejectedValue({});
await expect(async () => await repository.addUser(payload)).rejects.toThrow()
});
});
});