목차
toBe
방식 : 엄격한 동일성 검사(strict equality)
- Object.is를 사용하여 검사
- +0과 -0을 구분
- NaN === NaN 은 false 지만 Object.is(NaN, NaN) 은 true
용도
- 원시 값(primitive value) 비교 - 숫자, 문자열, null, undefined 등
- 동일한 객체 참조 확인 - 객체나 배열이 같은 메모리 주소를 가리키는지 확인
- 배열의 요소들이 순서와 내용까지 동일한지 확인
특징 : 값이 같더라도 서로 다른 객체나 배열인 경우 실패
예시
expect(10).toBe(10); // 통과
expect('hello').toBe('hello'); // 통과
const obj1 = { a: 1 };
const obj2 = { a: 1 };
expect(obj1).toBe(obj2); // 실패 (서로 다른 참조)
const obj3 = obj1;
expect(obj3).toBe(obj1) // 통과 (서로 같은 참조)
expect([1,2,3].toBe([1,3,2]) // 실패
expect([1,2,3].toBe([1,2,3]) // 성공
toEqual
방식: 깊은 비교 (Deep Equality)
- 객체나 배열의 구조와 내용을 비교
- 부모 클래스에서 상속된 속성은 무시
용도
- 객체나 배열의 구조와 내용을 비교할 때
- 부모 클래스에서 상속된 속성은 무시해도 괜찮을 때.
특징
- 참조를 무시하고 값만 비교
- 객체 내부에 중첩된 값도 비교
const obj1 = { a: 1 };
const obj2 = { a: 1 };
expect(obj1).toEqual(obj2); // 통과 (내용이 같음)
const array1 = [1, 2, 3];
const array2 = [1, 2, 3];
expect(array1).toEqual(array2); // 통과 (배열의 내용이 같음)
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
expect(obj1).toEqual(obj2); // 통과 (내용이 동일)
toStrictEqual
방식 : 객체의 구조(프로퍼티와 값) 그리고 타입(클래스 여부) 가 동일한지 비교 검사, 객체가 직접 소유한 프로퍼티만 비교
용도
- 더 엄격한 객체 검증이 필요할 때
- 객체의 키와 값이 같고, 구조가 완전히 동일한지 확인
- 명시되지 않은 속성(undefined)까지 검사해야 할때
- 단순히 {} 생성된 객체인지 클래스 인스턴스인지 비교가 필요한 경우
- 배열의 요소들이 순서와 내용까지 동일한지 확인
특징
- 객체의 추가적인 프로퍼티나 순서의 차이도 확인
- 상속받은 프로퍼티도 비교 대상에서 제외
- 상속받은 프로퍼티를 포함하려면 객체를 복사하거나 평탄화(flatten)필요
예시
const obj1 = { a: 1, b: 2 };
const obj2 = { a: 1, b: 2 };
expect(obj1).toStrictEqual(obj2); // 통과 (내용 동일)
const obj3 = { a: 1, b: 2, c: 3 };
expect(obj1).toStrictEqual(obj3); // 실패 (추가된 프로퍼티 c)
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
const arr3 = [1, 3, 2];
expect(arr1).toStrictEqual(arr2); // 통과 (배열 내용 동일)
expect(arr1).toStrictEqual(arr3) // 실패
/* 상속 프로퍼티 */
// 부모 클래스 정의
class Parent {
constructor() {
this.parentProp = 'parent';
}
}
// 자식 클래스 정의
class Child extends Parent {
constructor() {
super();
this.childProp = 'child';
}
}
const obj1 = new Child();
const obj2 = { childProp: 'child', parentProp: 'parent' };
// `toStrictEqual`은 obj1의 상속 프로퍼티(parentProp)를 비교하지 않음
expect(obj1).toStrictEqual(obj2); // 실패
// obj1의 모든 프로퍼티를 명시적으로 포함한 객체와 비교
const obj1Flattened = Object.assign({}, obj1);
expect(obj1Flattened).toStrictEqual(obj2); // 통과
* 평탄화 추가 설명
원래 obj1 객체 (상속 포함):
Child {
childProp: 'child',
__proto__: Parent {
parentProp: 'parent',
__proto__: Object
}
}
Object.assign({}, obj1)로 평탄화한 객체
{
childProp: 'child',
parentProp: 'parent'
}
차이점 요약
toBe | toEqual | toStrictEqual | |
비교 방식 | Object.is를 사용하여 참조와 값을 비교 | 구조와 내용의 깊은 비교 |
- toEqual의 기능 + 더 엄격한 검증 - 객체의 타입(인스턴스 여부)까지 검증 - 스파스 요소까지 포함 |
원시 값 비교 | 값이 같으면 true | 값이 같으면 true | 값이 같으면 true |
객체 비교 | 참조가 같아야 true | 객체의 내용이 같으면 true | 객체의 내용 + 타입이 같아야 true |
배열 비교 | 참조가 같아야 true | 배열의 내용과 순서가 같으면 true | 배열의 내용, 순서, 스파스 요소가 같아야 true |
클래스 인스턴스 비교 |
동일 참조일 때만 true | 구조가 같으면 true | 구조와 클래스 타입이 같아야 true |
스파스 요소 | 비교하지 않음 | 스파스 요소와 undefined를 동일하게 간주 | 스파스 요소와 undefined를 다르게 간주 |
사용 사례 | - 원시 값 비교 - 객체 참조 확인 - 동일한 메모리 위치인지 확인 |
- 객체의 구조나 내용을 검증할 때 - 배열, 객체의 내용 확인 |
- 객체의 구조와 타입까지 검증해야 할 때 - 배열의 스파스 요소 확인 |
'TDD > jest' 카테고리의 다른 글
[ jest ] Reflect.getMetadata(metadataKey, target) - 설정된 메타데이터 확인하는 메서드 (0) | 2024.12.02 |
---|---|
[ jest ] mockResolvedValue와 mockReturnValue의 차이 (0) | 2024.12.02 |
[ jest ] 에러 처리를 위한 단위 테스트 작성 (Create) (0) | 2024.11.14 |
[ jest ] express + jest 기본 설정 (1) | 2024.11.14 |
[ jest ] e2e : Given When Then (0) | 2024.09.08 |