우테코 미션에서 테스트 코드를 짜서 만든 기능을 검증하고 있기 때문에 요즘 테스트 코드에 골머리를 썩고 있다.
Matchers 중 몇가지가 정확한 용법이 헷갈려서 정리하게 되었다.
.toBe()는 원시값들을 서로 비교하거나 객체 인스턴스의 참조값이 같은지 확인한다. 두 값을 비교하기 위해 Object.is 함수를 호출하며, ===로 테스트하는 것 보다 더 나은 방식이다.
Object.is
js에서 제공하는 정적메소드로 인자로 받은 두 값이 일치하는지 확인한다.
Object.is와 ==와 달리 양 쪽 값의 종류, 데이터 타입이 다르면 일치하다고 보지 않는다.
그리고 Object.is는 === 와도 다른와도 다른데 부호가 있는 0, NaN을 값을 처리함에 있어서 ===와 다른 결과를 보여준다.
toEqual()은 객체 인스턴스의 모든 프로퍼티를 재귀적으로 비교한다.
원시값을 비교하기 위해 Object.is 를 사용한다.
toBeTruthy()는 어떤 값인지 신경쓰지 않고 그 값이 참인지만 확인하고 싶을 때 사용한다.
if (thirstInfo()) {
drinkMoreLaCroix();
}
구현 코드처럼 toBeTruthy를 작성한다면 위처럼 만들 수 있다.
JavaScript에서 부정의미를 가지고 있는 6개의 값 false, 0, ‘’, null, undefined, NaN 을 제외하고 나머지 값에 대해서 모두 참으로 처리한다.
마지막으로 세가지 matchers의 차이를 정리해보자.
일단, toBeTruthy()는 가장 널널한 테스트이다. expect 값이 부정이 아니면 테스트가 통과된다.
toBe(true)와 toEqual(true)가 가장 헷갈렸는데,
toBe(true)는 두 값이 완전 동일한 참조를 가지는 경우만 통과한다. 두 값이 정확하게 메모리에서 같은 객체나 원시값을 가지는 경우 테스트를 통과한다.
toEqual(true)는 두 객체 인스턴스의 내용을 비교한다. toBe()와 다르게 내부 값을 비교 하기 때문에 구조와 값이 일치하면 테스트가 통과된다.
객체를 테스트 할때 toBe가 toEqual보다 더 엄격하게 테스트 하기 때문에 우리가 객체 값에 대한 테스트를 진행할 경우 toBe로 작성한 테스를 통과하기 어려울 것 같다.
그래서 원시값 일치에 대한 테스트를 하는 경우에는 toBe, 객체의 content, 내용에 대한 일치를 테스트 하고 싶은 경우 toEqual을 사용하면될 것 같다.