반응형
Jest로 테스트 코드를 작성하다보면 습관적으로 IDE의 자동완성으로 toBeFalsy 와 toBeTruthy 를 사용하곤 했다.
저 둘이 아닌 toBe(false) 와 toBe(true) 는 한 번의 자동완성으로 안되기 때문에 굳이 사용하진 않았다.
그러다 팀 분의 의견을 받고 더이상 toBeFalsy() 는 사용하진 않고 있다.
물론 이에 맞는 쓰임새가 있겠지만, 모든 결과를 강타입으로 처리하는걸 선호하는 입장에서는
toBeFalsy()는 선호하기가 어렵다.
다음과 같은 이유 때문이다.
toBeFalsy()는 JS에서 false로 판단되는 모든 값들을 기준으로 한다
내가 의도한것은 boolean 타입의 false 를 원했지만, 수행 결과가 0, undefined, null, '' 이면 toBeFalsy() 는 통과한다
it('falsy로 검증하면 0도 통과된다', () => {
const result = calculate(); // result가 0임에도
expect(result).toBeFalsy();
});
실제로 다음과 같이 테스트 코드를 작성해서 테스트를 해보면 모든 값들이 통과한다
it.each([
[0],
[''],
[false],
[undefined],
[null],
])("calculate 결과가 %s이면 toBeFalsy 를 통과한다", (calculateResult) => {
const result = calculate(calculateResult);
expect(result).toBeFalsy();
});
그래서 정확하게 boolean:false를 기대한다면 toBe(false) 로 검증해야만 한다.
it('toBe(false)로 검증하면 0은 통과되지 못한다', () => {
const result = calculate(0);
expect(result).toBe(false);
});
테스트 코드는 두루뭉실하게 이것도 되고, 저것도 통과되도록 하는 것이 목표는 아니다.
원하는 결과가 명확하다면 그에 맞게 검증문 작성이 필요하다.