본문 바로가기
Testing/Jest

Jest : Matcher에 대해서

by 코딩쥐 2024. 9. 18.

Jest는 Matcher를 통해서 다양한 방식으로 값을 테스트할 수 있다. Matcher에 대한 내용은 Jest 공식 홈페이지 API를 참조하면 된다.

 

동등 비교

Matcher 설명
toBe(값) 기본 값을 비교하거나 객체 인스턴스의 참조 ID를 확인한다.
toEqual(값) 객체 인스턴스의 모든 속성을 비교한다. 즉 객체의 주소값이 아닌 깊은 값을 전부 비교한다.
toStrictEqual(값)  .toEqual과 비슷하지만, .toStrictEqual의 경우 객체의 키 값이나 배열의 값이 undefined일 경우에도 비교를 하며 해당 데이터의 타입도 비교한다. 
// fn.js
const fn = {
    funcA: (a) => a + 10,
    funcB: (a, b) => ([a, b, undefined]),
    funcC: (a, b, c) => ({a, b, c:undefined})
}

module.exports = fn;
//fn.test.js
const fn = require("../fn");

describe("동등함수 예제", () => {
    test("funcA에 2를 넣으면 결과값은 12이다.", () => {
        expect(fn.funcA(2)).toBe(12);
    });

    test("funcB에 1, 5를 넣으면 [1, 5]가 나온다.", () => {
        expect(fn.funcB(1,5)).toEqual([1,5]);
    });

    test("funcC에 '안녕', '반가워'를 넣으면 {a:'안녕', b:'반가워'}가 나온다.", () => {
      expect(fn.funcC('안녕', '반가워')).toEqual({a:'안녕', b:'반가워'});
    });

    test("funcC에 '안녕', '반가워'를 넣으면 {a:'안녕', b:'반가워'}가 나온다.", () => {
        expect(fn.funcC('안녕', '반가워')).toStrictEqual({a:'안녕', b:'반가워'});
      });

})

 

예제에서 보다시피 toEqual에선 passed였지만, toStrictEqual의 경우 "c: undefined" 값이 없어 failed가 된 것을 볼 수 있다.


true / false / null / undefined 확인

Matcher 설명
toBeTruthy() True 혹은 True에 준하는 값이 아닐 경우 에러 
toBeFalsy() False 혹은 False에 준하는 값이 아닐 경우 에러
toBeNull() Null 값이 아닐 경우 에러
toBeUndefined(() Undefined가 아닐 경우 에러
toBeDefined() Undefined의 반대가 아닐 경우 에러

* false에 준하는 값 : undefined, null, 0, -0, NaN, '', "" (값이 없을 때 false라고 인식한다. )

// fn.js

const fn = (value) => {
    switch (value) {
        case "true":
            return true;
        
        case "false":
            return false;
        
        case "null":
            return null;

        case "undefined":
            return undefined;
    }
}

module.exports = fn;
//fn.test.js

const fn = require("../fn");

describe("true / false / null / undefined 확인 예제", () => {
  test("value가 true면 true다.", () => {
    expect(fn("true")).toBeTruthy();
  });

  test("value가 false면 false다.", () => {
    expect(fn("false")).toBeFalsy();
  });

  test("value가 null이면 null이다.", () => {
    expect(fn("null")).toBeNull();
  });

  test("value가 undefined이면 undefined이다.", () => {
    expect(fn("undefined")).toBeUndefined();
  });

  test("value가 undefined이면 defined가 아니다.", () => {
    expect(fn("undefined")).not.toBeDefined();
  });
})

 

숫자 확인

Matcher 설명 
toBeGreaterThan() 해당 숫자보다 크면 매치
toBeGreaterThanOrEqual() 해당 숫자보다 크거나 같으면 매치
toBeLessThan() 해당 숫자보다 작으면 매치
toBeLessThanOrEqual() 해당 숫자보다 작거나 같으면 매치
toBeCloseTo() 해당 숫자에 근접하면 매치
describe("숫자 확인 예제", () => {
  test("2+2는 2보다 크다.", () => {
    expect(2+2).toBeGreaterThan(2);
  });

  test("5는 5보다 크거나 같다.", () => {
    expect(5).toBeGreaterThanOrEqual(5);
  });

  test("3는 8보다 작다.", () => {
    expect(3).toBeLessThan(8);
  });

  test("5는 5보다 작거나 같다.", () => {
    expect(5).toBeLessThanOrEqual(5);
  });

  // JavaScript에서 실제로 0.2+0.1 은 0.30000000000000004이기 때문에 테스트에서 failed한다.
  test("0.2+0.1은 0.3이다.", () => {
    expect(0.2+0.1).toBe(0.3);
  });

  //소수점 세자리까지 일치하면 근접하다고 본다.
  test("0.2+0.1은 0.3에 근접하다.", () => {
    expect(0.2+0.1).toBeCloseTo(0.3, 3);
  });
})


문자열 확인

문자열의 경우에는 toMatch정규표현식을 사용하여 테스트 할 수 있다. 

describe("문자열 확인 예제", () => {
  const text = "내가 좋아하는 과일은 사과다.";

  test("텍스트에 사과가 포함된다.", () => {
    expect(text).toMatch(/사과/);
    expect(text).toMatch(new RegExp("사과"));
  });
})


배열 확인

배열의 경우 toContain을 통해 해당 요소가 포함되어있는지 아닌지를 테스트 할 수 있다.

describe("배열 확인 예제", () => {
  const arr = ["apple", "banana", "grapefruit", "grape"];

  test("배열에 grape가 있다", () => {
    expect(arr).toContain("grape");
  });

  // 배열의 인덱스를 통해 해당 인덱스의 요소를 테스트할 수 있다. 
  test("배열의 1 인덱스는 banana다.", () => {
    expect(arr[1]).toBe("banana");
  });
});


예외처리 확인

예외처리는 toThrow를 통해 테스트가 가능하다.

function checkNum(number) {
  if (typeof (number) === "number") {
    return console.log(`작성하신 숫자는 : ${number} 입니다.`);
  } else {
    throw new Error("숫자를 작성하지 않으셨습니다.");
  }
}

describe("예외처리 확인 예제", () => {
  test("문자열을 입력하면 에러가 발생한다.", () => {
    // 에러 발생여부를 확인한다. 
    expect(() => checkNum("안녕")).toThrow();
  });

  test("문자열을 입력하면 발생하는 에러문구 중에 `숫자`라는 글자가 들어간다.", () => {
    // 에러 메시지에 '숫자'가 포함되어 있는지 확인
    expect(() => checkNum("안녕")).toThrow(/숫자/);
  });

});

 

'Testing > Jest' 카테고리의 다른 글

Jest: Only와 Skip 사용해보기  (0) 2024.09.18
Jest: Mock Function에 대해서  (0) 2024.09.11
Jest : 테스트 전 후 작업 설정하기  (0) 2024.09.11
Jest: 비동기 코드 테스트하기  (0) 2024.09.11
Jest 사용하기  (0) 2024.09.10