[React] Jest matcher 함수 종류
유용한 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' 문자열을 반환하는지?
});
참고