Let`s study hard : 지대넓얕/TEST:Jest

[jest로 test하기] toBe vs toEqual vs toStrictEqual

유니엘. 2021. 11. 7. 13:10
728x90

toBe vs toEqual

 

jest를 처음 배우면 예시로 가장 많이 나오는 것이 아마 toBe일 것이다.

test('1 = 1이다.', () => {
	expect(1).toBe(1);
});

영어처럼 해석을 해 본다면 아마 1이 1이기를 기대한다 정도 되지 않을까.

 

조금 더 공부하다보면 비교를 할 수 있는 여러가지 문법이 나오는데, 그 중에서도 toBe와 toEqual은 같은든 매우 다른 양상을 보인다.

 

예를들어

test('1+1 = 2가 맞을까', () =>{
	expect(1+1).toBe(2);
});
test('1+1 = 2가 맞을까', () =>{
	expect(1+1).toEqual(2);
});

의 상단 두 구문은 toBe와 toEqual 모두 true를 반환하여 test를 통과한다. 여기까지보면 둘 차이를 잘 모르겠지만 둘의 차이는 object를 비교할 때, 나온다.

 

예를들어 name과 age를 받아 user 객체를 생성하는 함수가 있다고 가정해보자.

// testFunction.js 파일

const fns = () => {
	user: (name, age) => ({name, age})
}

module.exports = fns;

이 모듈을 사용하여 toBe와 toEqual을 비교하면

const fns = require(~경로/testFunctions.js);

test('toBe user Test', () => {
	expect(fns.user('김철수', 10)).toBe({
    	name: '김철수',
        age: 10
    });
});
const fns = require(~경로/testFunctions.js);

test('toBe user Test', () => {
	expect(fns.user('김철수', 10)).toEqual({
    	name: '김철수',
        age: 10
    });
});

놀랍게도 toBe는 test에 실패하고, toEqual은 성공하는 단순 숫자 비교와는 다른 결과가 나타난다.

 

이는 toBe는 객체의 메모리 주소를 확인하고, toEqual은 객체의 값을 확인하기 때문이다. 즉 toBe는 값이 같다고 하더라도 fns.user()로 생성된 객체와 toBe()에서 생성된 객체가 서로 다른 곳에 저장되어 있어 그 주소값이 다르기 때문에 동일하다고 인식 할 수 없지만 toEqual은 fns.user()로 생성된 객체와 toEqual()에서 생성된 객체의 결과값 name: '김철수', age: 10의 값이 동일하기 때문에 동일하다고 인식할 수 있는 것이다.

 

 

toEqual vs toStrictEqual

 

더 나아가 toStrictEqual이라는 함수가 있는데, 이는 말 그대로 엄격한 비교를 해준다.

// testFunction.js 파일

const fns = () => {
	user: (name, age) => ({name, age}),
	strictUser: (name, age, adress) => ({name, age, adress: undefined})
}

module.exports = fns;

strictUser 모듈을 toEqaul과 toStrictEqual로 불러왔을 때,

const fns = require(~경로/testFunctions.js);

test('toBe user Test', () => {
	expect(fns.strictUser('김철수', 10)).toEqual({
    	name: '김철수',
        age: 10
    });
});
const fns = require(~경로/testFunctions.js);

test('toBe user Test', () => {
	expect(fns.strictUser('김철수', 10)).toStrictEqual({
    	name: '김철수',
        age: 10
    });
});

상단 toEqual은 통과, toStrictEqual은 실패가 된다. 말 그대로 엄격하게 비교를 하였더니 user의 adress가 입력되지않아 undefined를 반환하였기 때문이다. 이 경우 해당 코드를

const fns = require(~경로/testFunctions.js);

test('toBe user Test', () => {
	expect(fns.strictUser('김철수', 10)).toStrictEqual({
    	name: '김철수',
        age: 10,
	adress: '서울시'
    });
});

이렇게 바꾸면 통과할 수 있게 된다.

728x90