쉽게 말하면, test(또는 it)들을 describe라는 블록으로 묶음으로서 스코프를 공유하고 가독성을 높이는 것이다. 비즈니스 로직과 관련된 테스트는 기획자를 비롯한 비개발자도 보고 바로 이해할 수 있어야 한다. 늘 그렇듯 패턴을 적용하지 않고 해보는 것이 우선이다.
막상 쓰고 보니 그렇게 좋은 예제 같진 않지만, 우선 테스트 코드에서 무엇을 하고 있는지 살펴보자. 전역에 두 개의 변수를 초기화해주고 이를 여러 테스트에서 사용하고 있다. 세 개의 테스트에서는 number 변수를 사용하고 있고, 마지막 테스트는 number2 변수만을 사용하고 있다. 이런 경우 같은 스코프를 공유하고 있기 때문에 실수로 다른 변수를 사용할 수도 있다.
처음 두 테스트에서는 expect를 이용한 검증 없이 단순히 number 변수에 다른 값을 할당하고 있는데, 이를 전역 스코프에서 하자니 찝찝한 것은 사실이다. 테스트를 실행했을 때 나오는 콘솔 창도 같은 문맥을 사용하고 있으니 테스트간의 연관관계가 있다는 착각을 하게 된다.
describe를 이용해 테스트 코드를 리팩토링해보자.
import { MyNumber } from'./calculator';describe('MyNumber을 1로 생성하고', () => {let number =newMyNumber(1);describe('2를 더하고 3을 곱한다.', () => { number =number.add(2); number =number.times(3);it('2로 나누면 4.5가 나올 것이다.', () => { number =number.divide(2);expect(number.equals(4.5)).toBeTruthy(); }); });});describe('MyNumber을 2로 생성하고', () => {constnumber2=newMyNumber(2);it('2에서 5를 빼면 -3이 나올 것이다.', () => {expect(number2.subtract(5).equals(-3)).toBeTruthy(); });});