게으른개발너D

jest - Matcher 본문

개발/JavaScript

jest - Matcher

lazyhysong 2023. 10. 23. 18:21

https://jestjs.io/docs/expect

 

Expect · Jest

When you're writing tests, you often need to check that values meet certain conditions. expect gives you access to a number of "matchers" that let you validate different things.

jestjs.io

다양한 Matcher는 여기서 확인할 수 있다.

 

1. toBe, toEqual

toBe와 비슷한 것은 toEqual이다.

fn.test.js

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

test("2 더하기 3은 5이다.", () => {
   expect(fn.sum(2, 3)).toBe(5);
});

test("2 더하기 3은 5이다.", () => {
   expect(fn.sum(2, 3)).toEqual(5);
});

둘 다 통과한다.


fn.js 코드에 함수를 하나 더 추가해 주자

fn.js

const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age) => ({ name, age }),
};

module.exports = fn;

이름과 나이를 받아서 해당 객체를 반환해주는 makeUser라는 함수를 추가했다.

테스트를 진행해 보자.

 

fn.test.js

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

test("이름과 나이를 전달 받아서 객체를 반환해줘.", () => {
   expect(fn.makeUser('Mike', 30)).toBe({
      name: 'Mike',
      age: 30,
   });
});

결과는 실패이다.

객체나 배열은 재귀적으로 돌면서 값을 확인해줘야하기 때문에 toEqual을 써줘야한다.

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

test("이름과 나이를 전달 받아서 객체를 반환해줘.", () => {
   expect(fn.makeUser('Mike', 30)).toEqual({
      name: 'Mike',
      age: 30,
   });
});

이렇게 toEqual을 사용하면 통과가 된다.

위의 toBe를 사용했을 때 실패 메세지를 읽어보면 깊은 비교를 위해서 toBe 대신 toStrictEqual을 사용하라고 권한다.

toEqual을 사용하는 것과 toStrictEqual 사용하는 것은 어떤 차이가 있을까?

 

비교를 위해 fn.js의 makeUser 객체에 gender를 추가해 보자.

fn.js

const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age) => ({ name, age, gender: undefined, }),
};

module.exports = fn;

fn.test.js

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

test("이름과 나이를 전달 받아서 객체를 반환해줘.", () => {
   expect(fn.makeUser('Mike', 30)).toEqual({
      name: 'Mike',
      age: 30,
   });
});

test("이름과 나이를 전달 받아서 객체를 반환해줘.", () => {
   expect(fn.makeUser('Mike', 30)).toStrictEqual({
      name: 'Mike',
      age: 30,
   });
});

결과는 toStrictEqual을 쓴 test가 실패하게 된다.

원래라면 genger라는 요소도 추가되어 결과로 반환되어야하기 때문이다.

좀 더 엄격하게 사용하려면 toStrictEqual을 사용하자.

 

 

 

2. toBeNull, toBeUndefined, toBeDefined

이 Matcher들은 말 그대로 null, undefined, defined일 경우 통과된다.

test("null은 null입니다.", () => {
  expect(null).toBeNull();
});

 

 

3. toBeFalsy, toBeTruthy

boolean 값을 판별해 준다.

test("0은 false입니다.", () => {
  expect(fn.add(1, -1)).toBeFalsy();
});

0은 falsy 값이기 때문에 test는 통과된다.

 

 

 

4. toBeGreaterThan, toBeGreaterThanOrEqual, toBeLessThan, toBeLessThanOrEqual...

숫자와 관련된 matcher이다. 순서대로 크다, 크거나 같다, 작다, 작거나 같다임을 판별하는 것이다.

test("ID는 10자 이하여야 합니다.", () => {
  const id = "The_BLack";
  expect(id.length).toBeLessThanOrEqual(10);
});
test("비밀번호는 4자입니다.", () => {
  const pw = "1234";
  expect(pw.length).toEqual(4);
});

0.2, 0.3과 같은 소수들의 덧셈은 어떻게 될까?

자바스크립트에서 0.1 + 0.2은 정확히 0.3이 아니다.

test("0.1 더하기 0.2는 0.3입니다.", () => {
  expect(fn.add(0.1, 0.2)).toBe(0.3);
  // js가 소숫점을 정확하게 계산하지 못하므로 toBe를 쓰면 fail임
});

이걸 맞게 하려면 toBeCloseTo를 쓰면 된다.

test("0.1 더하기 0.2는 0.3입니다.", () => {
  expect(fn.add(0.1, 0.2)).toBe(0.3);
});

 

 

5. 문자열 toMatch

test("Hello World에 H라는 글자가 있나?", () => {
  expect("Hello World").toMatch(/H/);
  // 정규 표현식을 넣어줌 (대소문자 구분을 없앨려면 /H/i 를 써주면 됨)
});

여기서 대소문자 구분을하기 때문에 H대신 h를 넣으면 test에 실패하게 된다.

대소문자 구분을 없앨려면 /h/ 뒤에 i를 붙여 /h/i 를 쓰면 된다.

 

 

6. 배열 toContain

배열에서 특정 요소가 있는지 확인한다.

test("유저 리스트에서 Mike가 있나", () => {
  const user = "Mike";
  const userList = ["Tom", "Mike", "Kai"];
  expect(userList).toContain(user);
});

 

 

7. 예외 발생 확인 toThrow

fn.js 에 함수를 하나 더 추가하자.

const fn = {
  add: (num1, num2) => num1 + num2,
  makeUser: (name, age) => ({ name, age, gender: undefined }),
  throwErr: () => {
    throw new Error("xx");
  },
};

module.exports = fn;

fn.test.js

test("이거 에러 나나요?", () => {
  expect(() => fn.throwErr()).toThrow("xx");
  // 어떠한 작업을 했을 때 특정 에러가 발행하는지 테스트
});

 

 

 


출처

코딩앙마 (유튜브)

https://youtu.be/_36vt4fBjOQ?si=KLLK4ebRGjx-mck8

'개발 > JavaScript' 카테고리의 다른 글

jest - 비동기 코드 테스트  (0) 2023.10.24
jest - 설치 및 튜토리얼  (0) 2023.10.23
[test] js test code 작성  (0) 2023.08.07
스코프(Scope)와 클로저(Closure)  (0) 2023.08.04
흐름제어 (Control Flow, Data Flow)  (0) 2023.08.04
Comments