인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

보노보놈님의 프로필 이미지
보노보놈

작성한 질문수

따라하며 배우는 TDD 개발 [2023.11 업데이트]

getProductById 통합 테스트 작성 (2)

matcher 관련 질문입니다.

작성

·

137

0

expect("1").toEqual("1")
테스트 할 수 없나요? 항상 타임아웃 실패가 됩니다.

그리고 toEqual 과 toBe 의 차이도 알고 싶습니다.

답변 1

0

John Ahn님의 프로필 이미지
John Ahn
지식공유자

안녕하세요 !!

expect("1").toEqual("1")은 아마 어디 설정이 잘못 되어 있는게 아닌가 싶습니다 !


원시 타입 데이터(primitive type)를 비교할 때는 toBe와 toEqual을 써도 차이가 없습니다. 

하지만 참조 타입 데이터(reference type)를 비교할 때는  차이가 나는데 우선 예를 보겠습니다. 

test('should ', () => {
let a = {a: "1", b: "2"}
let b = {a: "1", b: "2"}

expect(a).toEqual(b);
})

이거는 잘 Pass가 됩니다. 

test('should ', () => {
let a = {a: "1", b: "2"}
let b = {a: "1", b: "2"}

expect(a).toBe(b);
})

하지만 이렇게 되면 FAIL이 나옵니다. 
그 이유는  toBe 나  toStricEqaul은   Deep Equality Check 을 하기 때문입니다. 
더 딥하게 체크를하는거죠 ! 

test('should ', () => {
let a = {a: "1", b: "2"}
let b = {a: "1", b: "2"}
let c = a;
expect(a).toBe(c);
})

이렇게 하면 또 성공을 합니다! 
그 이유는 a와 b는 비록 객체안에 내용은 같지만 메모리안에 객체를 저장할 때 그 인스턴스는 서로 다르기 떄문입니다. 하지만   a와 c는 같습니다. 그러기에 toBe를 사용해서 Deep Equality Check을 해도 PASS하게 됩니다.  
수고하세요 !!! 

보노보놈님의 프로필 이미지
보노보놈
질문자

우와 자세한 답변 감사합니당

보노보놈님의 프로필 이미지
보노보놈

작성한 질문수

질문하기