프론트엔드/React

[React] Jest matcher 함수 종류

zero2-pooh 2024. 3. 25. 01:57

유용한 matcher함수 종류 정리

 

// person.js

// 테스트할 함수
function getPerson(id) {
  return {
    id,
    email: `person${id}@test.com`,
  };
}

module.exports = getPerson;

 

 


toEqual()

 

- 객체가 일치한지 검증한다. 웬만한 일치를 비교하려할때 이 메소드를 쓰면 된다.

const { getPerson } = require('person'); // 테스트할 함수를 가져옴 

test("return a user object", () => {
  // getPerson(1)의 리턴 결과값이 { 객체 } 값이 같은 경우 true
  expect(getPerson(1)).toEqual({
    id: 1,
    email: `person@test.com`,
  });
});

// or

test('객체의 속성들이 같은지 확인', () => {
  const obj1 = { a: 1, b: 2 };
  const obj2 = { a: 1, b: 2 };
  expect(obj1).toEqual(obj2);
});

 

 

 

 

toBe()

 

- 주어진 값이 엄격하게 동일한지를 확인한다.

test('2 + 2는 4이다.', () => {
  expect(2 + 2).toBe(4);
});

 

 

 

 

toBeTruthy() / toBeFalsy()

 

- 주어진 값참(true) 또는 거짓(false)인지 확인한다.

🖐🏻 느슨한 타입 기반 언어인 자바스크립트는, 자바같은 강한 타입 기반 언어처럼 true false가 boolean 타입에 한정되지 않는다.

따라서 숫자 1 true로 간주되고, 숫자 0 false로 간주되는 것과 같이,

모든 타입의 값들을 true 아니면 false 간주하는 규칙이 있는데, 

 

toBeTruthy() 는 검증 대상이 이 규칙에 따라 true로 간주되면 테스트 통과이고, 

toBeFalsy() 는 반대로 false로 간주되는 경우 테스트가 통과된다.

test('true는 참이다.', () => {
  expect(true).toBeTruthy();
});

test('false는 거짓이다.', () => {
  expect(false).toBeFalsy();
});

 

 

 

 

toContain(item)

 

- 배열 또는 문자열이 주어진 항목을 포함하는지 확인한다.

test('배열에 특정 항목이 포함되어 있는지 확인', () => {
  const arr = [1, 2, 3, 4, 5];
  expect(arr).toContain(3);
});

 

 

 

toThrow(error)

 

- 함수가 특정 에러를 발생시키는지 확인한다. (예외 발생 여부 확인)

👉🏻 이 함수는 인자도 받는데, 문자열을 넘기면 예외 메세지를 비교하고 정규식을 넘기면 정규식 체크를 해준다. 

 

❗️ 주의할점은, toThrow() 함수를 사용할 때 반드시 expect() 함수에 넘기는 검증 대상을 함수로 한 번 감싸줘 한다.

그렇지 않으면 예외 발생 여부를 체크하는 것이 아니라, 테스트 실행 도중 정말 그 예외가 발생하기 때문에 그 테스트는 항상 실패하게 되기 때문이다. 

// 1

function throwError() {
  throw new Error('에러 발생!');
}

test('함수가 에러를 발생시키는지 확인', () => {
  expect(throwError).toThrow(Error);
});


// 2
const { getPerson } = require('person'); // 테스트할 함수를 가져온다. 

test("throw when id is non negative", () => {
  expect(() => getPerson(-1)).toThrow(); // 예외를 검증할때는, 함수를 한번 더 감싸준다.
  expect(() => getPerson(-1)).toThrow("Invalid ID");
});

 

 

 

toMatch(regexp)

 

- 문자열이 정규식과 일치하는지 확인한다. 

test('문자열이 특정 패턴과 일치하는지 확인', () => {
  expect('Hello, Jest!').toMatch(/Jest/);
});

 

 

 

toHaveProperty()

 

- 객체에 해당 key : value 값이 있는지 검사한다.

test("find person property", async () => {
   const person = {
      id : 1,
      name : "Leanne Graham"
   }
   
   expect(person).toHaveProperty("id", 1); // { id : 1 } 이 person 객체에 있나? -> true
   expect(person).toHaveProperty("name", "Leanne Graham");
 });

 

 

 

toBeCalledTimes() / toBeCalledWith()

 

- toBeCalledTimes : 함수가 몇번 호출되었는지 검증

 toBeCalledWith() : 함수가 설정한 인자로 호출 되었는지 검증

animal("dog");
animal("dog");

expect(animal).toHaveBeenCalledTimes(2); // animal함수가 2번 호출?
expect(animal).toHaveBeenCalledWith("dog"); // animal함수가 "dog" 문자열 인자로 호출?

 

 

 

toReturnWith() / toHaveReturnedWith(value)

 

- 함수가 지정한 값을 반환하는지 테스트

test('drink returns La Croix', () => {
  const beverage = {name: 'La Croix'};
  const drink = jest.fn(beverage => beverage.name);

  drink(beverage);

  expect(drink).toHaveReturnedWith('La Croix'); // drink(beverage) 함수 결과가 'La Croix' 문자열을 반환하는지?
});

 

 

 

 

 

 

참고

 

 

 

https://inpa.tistory.com/entry/JEST-%F0%9F%93%9A-jest-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC