게으른개발너D
jest - Matcher 본문
다양한 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");
// 어떠한 작업을 했을 때 특정 에러가 발행하는지 테스트
});
출처
코딩앙마 (유튜브)
'개발 > 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 |