Jest (23/01/18)

nazzzo·2023년 1월 25일
0

TDD 맛보기

단위(unit) 테스트란

개발 초기단계에서 클래스의 메서드를 하나씩 점검하기 위해
테스트만을 위한 코드를 작성하는 것을 '단위(unit) 테스트'라고 말합니다
(메서드가 잘 호출되는지, 오류는 없는지...)

  • 독립적으로 테스트할 수 있어야 합니다 (의존성 X)
  • DB에 연동된 Repository는? 통합 테스트쪽에서

단위 테스트는 수정 비용을 줄이는 데 도움이 됩니다

Jest

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()
    });
  });
});

0개의 댓글