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;
const MyCalculator = require("../calculator");
describe("Calculator", () => {
it("inits with 0", () => {
const cal = new MyCalculator();
expect(cal.value).toBe(0);
});
});
test('add', () => {
})
test('subtract', () => {
})
...
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이 있다.
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);
});
});
});