티스토리 뷰
[!이시중] 2021년 11월 7일 13:10에 최초 작성된 글로써 원글은 https://yuniel.tistory.com/47 에서 확인할 수 있음.
- 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: '서울시' }); });
이렇게 바꾸면 통과할 수 있게 된다.
'Test > jest' 카테고리의 다른 글
[jest로 test하기] jest matcher 모음집 (+계속 추가중) (0) | 2021.12.07 |
---|---|
[jest로 test하기] 간단 명료한 Jest의 기본사항 모음 (0) | 2021.12.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- gitRebase
- 크롬
- 센트리
- js테스트
- 리액트상태관리
- frontend
- 김민태
- sentry
- js
- npm
- 깃
- storybookUI
- 사파리
- 자바스크립트
- reacthook
- TIL
- javascript
- 리액트
- 프론트앤드
- 리코일
- react
- 센트리모니터링
- vue
- Git
- CSS
- 프론트엔드
- 모바일사파리
- 깃명령어
- BFCache
- 리액트훅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함