Jest describe, it, beforeEach

버건디·2023년 4월 8일
0

jest

목록 보기
1/3

- Calculator 클래스 생성

class Calculator {
  value: number;

  constructor() {
    this.value = 0;
  }

  set(num: number) {
    this.value = num;
  }

  clear() {
    this.value = 0;
  }

  add(num: number) {
    this.value = this.value + num;
  }

  subtract(num: number) {
    this.value = this.value - num;
  }

  multiply(num: number) {
    this.value = this.value * num;
  }

  divide(num: number) {
    this.value = this.value / num;
  }
}

module.exports = Calculator;

- Calculator.test.ts

const MyCalculator = require("../calculator");

describe("Calculator", () => {
  it("inits with 0", () => {
    const cal = new MyCalculator();
    expect(cal.value).toBe(0);
  });
});

describe => 관련있는 여러 테스트들을 한번에 묶어주는 역할

만약에 test만 사용한다면


test('add', () => {

})

test('subtract', () => {

})

...

describe 를 사용해서 묶어주기

const MyCalculator = require("../calculator");

describe("Calculator", () => {
  // test를 사용해도 무관.
  // it을 사용한다면, it은 위에서 적어놓은 Calculator 그룹자체를 가리킴.
  it("inits with 0", () => {
    const cal = new MyCalculator();
    expect(cal.value).toBe(0);
  });

  it("sets", () => {
    const cal = new MyCalculator();
    cal.set(9);
    expect(cal.value).toBe(9);
  });
  ...
  ...
});

- 주의사항

const MyCalculator = require("../calculator");

// 그룹화 해서 테스트할때 사용하는 describe, 테스트파일에 많은 테스트를 해야할 경우 사용
describe("Calculator", () => {
  // test를 사용해도 무관.
  // it을 사용한다면, it은 위에서 적어놓은 Calculator 그룹자체를 가리킴.
  it("inits with 0", () => {
    const cal = new MyCalculator();
    expect(cal.value).toBe(0);
  });

  it("sets", () => {
    const cal = new MyCalculator();
    cal.set(9);
    expect(cal.value).toBe(9);
  });
});

위의 코드를 보면 클래스를 각각 test마다 초기화 해주어서 코드를 작성해주는데, describe 안에 최상단에 class를 초기화해서 사용하면 안될까 ?

const MyCalculator = require("../calculator");

describe("Calculator", () => {
  const cal = new MyCalculator();

  it("inits with 0", () => {
    expect(cal.value).toBe(0);
  });

  it("sets", () => {
    cal.set(9);
    expect(cal.value).toBe(9);
  });
});

이렇게 해서 사용하면 안된다. 각각의 테스트는 각자만의 독립성을 보장해야한다.

그렇다면, 매 구문마다 초기화를 해줘야하는가 ? 이럴때 사용하는것이 beforeEach 이다 .

beforeEach는 각각의 테스트전에 초기화 작업을 해주는 역할을 한다.

const MyCalculator = require("../calculator");

describe("Calculator", () => {
  let cal: Calculator; // Calculator 클래스 타입 선언 

  beforeEach(() => {
    cal = new MyCalculator();
  });

  it("inits with 0", () => {
    expect(cal.value).toBe(0);
  });

  it("sets", () => {
    cal.set(9);
    expect(cal.value).toBe(9);
  });
});

반대의 역할로는 afterAll이 있다.

- describe 안에 describe

const MyCalculator = require("../calculator");

describe("Calculator", () => {
  let cal: Calculator;

  beforeEach(() => {
    cal = new MyCalculator();
  });

  it("subtract", () => {
    cal.set(9);
    cal.subtract(2);
    expect(cal.value).toBe(7);
  });

  it("multiply", () => {
    cal.set(2);
    cal.multiply(2);
    expect(cal.value).toBe(4);
  });
  
  ...

  // 나누기를 하는경우, 경우의수가 여러가지가 있기때문에 describe안에 또 describe를 이용해서 그룹화를 해준다. 
  
  describe("divides", () => {
    it("0 / 0 === NaN", () => {
      cal.set(0);
      cal.divide(0);
      expect(cal.value).toBe(NaN);
    });
    it("1 / 0 === Infinity", () => {
      cal.set(1);
      cal.divide(0);
      expect(cal.value).toBe(Infinity);
    });
    it("4 /4 === 1", () => {
      cal.set(4);
      cal.divide(4);
      expect(cal.value).toBe(1);
    });
  });
});
profile
https://brgndy.me/ 로 옮기는 중입니다 :)

0개의 댓글