티스토리 뷰

[!이시중] 2021년 11월 7일 13:10에 최초 작성된 글로써 원글은 https://yuniel.tistory.com/47 에서 확인할 수 있음.

 


  1. 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의 값이 동일하기 때문에 동일하다고 인식할 수 있는 것이다.


  2. 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: '서울시'
        });
    });​

    이렇게 바꾸면 통과할 수 있게 된다.
     
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함