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: '서울시'
});
});
이렇게 바꾸면 통과할 수 있게 된다.
'Let`s study hard : 지대넓얕 > TEST:Jest' 카테고리의 다른 글
[jest로 test하기] jest matcher 모음집 (+계속 추가중) (0) | 2021.11.08 |
---|---|
[jest로 test하기] 간단 명료한 Jest의 기본사항 모음 (0) | 2021.11.06 |