Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

Jasmine 자바스크립트 테스팅 – toBe와 toEqual의 차이점 완벽 이해하기

자바스크립트에서 배열을 비교하는 방법은 크게 두 가지로 나눌 수 있습니다.

  • 두 변수가 메모리상에서 동일한 배열 객체를 참조하는 경우
  • 두 변수가 서로 다른 객체를 참조하지만, 그 내용(요소)이 모두 같은 경우

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 테스트 작성 방법입니다.