자바스크립트에서 배열을 비교하는 방법은 크게 두 가지로 나눌 수 있습니다.
- 두 변수가 메모리상에서 동일한 배열 객체를 참조하는 경우
- 두 변수가 서로 다른 객체를 참조하지만, 그 내용(요소)이 모두 같은 경우
Jasmine은 이 두 가지 상황을 각각 검증할 수 있도록 toBe()와 toEqual()이라는 매처(matcher)를 제공합니다. 각각의 차이를 예제와 함께 살펴보겠습니다.
1. toBe() – 참조(reference) 동등성 비교
toBe()는 객체의 참조가 같은지, 즉 메모리상에서 동일한 객체를 가리키는지를 확인합니다.
describe("Array Equality", () => {
it("should check for array reference equality", () => {
let arr = [1, 2, 3];
let arr2 = arr;
// 참조가 같으므로 테스트 통과
expect(arr).toBe(arr2);
// 내용은 같지만 참조가 다르므로 테스트 실패
expect(arr).toBe([1, 2, 3]);
});
});출력 결과
1) Array Equality should check for array equality
Message:
Expected [ 1, 2, 3 ] to be [ 1, 2, 3 ]. Tip: To check for deep equality, use .toEqual() instead of .toBe().위 결과에서 볼 수 있듯이, [1, 2, 3]과 내용이 완전히 같은 새 배열을 만들어 비교하더라도 참조가 다르기 때문에 toBe()는 실패합니다. 에러 메시지에서도 깊은 비교(deep equality)가 필요하다면 .toEqual()을 사용하라고 안내하고 있습니다.
2. toEqual() – 값(value) 기반 깊은 비교
toEqual()은 배열이나 객체의 실제 내용을 재귀적으로 비교하는 깊은 비교(deep compare)를 수행합니다. 따라서 서로 다른 객체라도 내용이 같으면 테스트를 통과합니다.
describe("Array Equality", () => {
it("should check for array value equality", () => {
let arr = [1, 2, 3];
let arr2 = arr;
// 참조가 같으므로 테스트 통과
expect(arr).toEqual(arr2);
// 내용이 같으므로 역시 테스트 통과
expect(arr).toEqual([1, 2, 3]);
});
});출력 결과
1 spec, 0 failures
정리
| 매처 | 비교 방식 | 사용 시나리오 |
|---|---|---|
toBe() | 참조(동일성) 비교 | 같은 객체 인스턴스인지 확인할 때 |
toEqual() | 깊은 비교(값 비교) | 내용이 같은지 확인할 때 |
결론적으로, 원시 타입(primitive) 값이나 동일 객체 여부를 확인할 때는 toBe()를, 배열·객체의 내용 자체를 비교할 때는 toEqual()을 사용하는 것이 올바른 Jasmine 테스트 작성 방법입니다.