toBe() vs toEqual() vs toBeTruthy()

_sw_·2023년 11월 11일

우테코 미션에서 테스트 코드를 짜서 만든 기능을 검증하고 있기 때문에 요즘 테스트 코드에 골머리를 썩고 있다.

Matchers 중 몇가지가 정확한 용법이 헷갈려서 정리하게 되었다.

toBe()

.toBe()는 원시값들을 서로 비교하거나 객체 인스턴스의 참조값이 같은지 확인한다. 두 값을 비교하기 위해 Object.is 함수를 호출하며, ===로 테스트하는 것 보다 더 나은 방식이다.

Object.is

js에서 제공하는 정적메소드로 인자로 받은 두 값이 일치하는지 확인한다.

Object.is와 ==와 달리 양 쪽 값의 종류, 데이터 타입이 다르면 일치하다고 보지 않는다.

그리고 Object.is는 === 와도 다른와도 다른데 부호가 있는 0, NaN을 값을 처리함에 있어서 ===와 다른 결과를 보여준다.

toEqual()

toEqual()은 객체 인스턴스의 모든 프로퍼티를 재귀적으로 비교한다.

원시값을 비교하기 위해 Object.is 를 사용한다.

toBeTruthy()

toBeTruthy()는 어떤 값인지 신경쓰지 않고 그 값이 참인지만 확인하고 싶을 때 사용한다.

if (thirstInfo()) {
	drinkMoreLaCroix();
}

구현 코드처럼 toBeTruthy를 작성한다면 위처럼 만들 수 있다.

JavaScript에서 부정의미를 가지고 있는 6개의 값 false, 0, ‘’, null, undefined, NaN 을 제외하고 나머지 값에 대해서 모두 참으로 처리한다.

toBe(true) vs toEqual(true) vs toBeTruthy()

마지막으로 세가지 matchers의 차이를 정리해보자.

일단, toBeTruthy()는 가장 널널한 테스트이다. expect 값이 부정이 아니면 테스트가 통과된다.

toBe(true)와 toEqual(true)가 가장 헷갈렸는데,

toBe(true)는 두 값이 완전 동일한 참조를 가지는 경우만 통과한다. 두 값이 정확하게 메모리에서 같은 객체나 원시값을 가지는 경우 테스트를 통과한다.

toEqual(true)는 두 객체 인스턴스의 내용을 비교한다. toBe()와 다르게 내부 값을 비교 하기 때문에 구조와 값이 일치하면 테스트가 통과된다.

객체를 테스트 할때 toBe가 toEqual보다 더 엄격하게 테스트 하기 때문에 우리가 객체 값에 대한 테스트를 진행할 경우 toBe로 작성한 테스를 통과하기 어려울 것 같다.

그래서 원시값 일치에 대한 테스트를 하는 경우에는 toBe, 객체의 content, 내용에 대한 일치를 테스트 하고 싶은 경우 toEqual을 사용하면될 것 같다.

Reference

https://jestjs.io/docs/expect#tobevalue

https://jestjs.io/docs/expect#toequalvalue

profile
나도 잘하고 싶다..!

0개의 댓글