[Node.js] Jest - 1. 유용한 Matchers
값이 같은지(근사치인지) 판단하는 테스트
fn.js
const fn = {
add: (a,b) => a+b,
makeUser: (name,age) => ({name,age,gender:undefined})
};
module.exports = fn;
fn.test.js
const fn = require("./fn");
test("2 더하기 3은 5야", () => {
expect(fn.add(2,3)).toBe(5);
}); // 테스트 성공
test("이름과 나이를 전달받아서 반환해줘", () => {
expect(fn.makeUser("Mike",30)).toEqual({
name: "Mike",
age: 30,
});
}); // 테스트 성공
test("이름과 나이를 전달받아서 반환해줘", () => {
expect(fn.makeUser("Mike",30)).toStrictEqual({
name: "Mike",
age: 30,
});
}); // 테스트 실패
toBe
숫자를 비교
toBeCloseTo
소수점을 비교
test("0.2 더하기 0.3은 0.5야", () => {
expect(fn.add(0.2,0.3)).toBe(0.5);
}); // 테스트 실패
test("0.2 더하기 0.3은 0.5야", () => {
expect(fn.add(0.2,0.3)).toBeCloseTo(0.5);
}); // 테스트 성공
자바스크립트는 소수점을 정확히 계산하지 못한다. (컴퓨터는 이진법을 사용하기 때문에 소수를 이진수로 바꿨을 때 몇몇 값은 무한소수가 됨)
따라서 소수점을 테스트하기 위해서는 toBeCloseTo
를 사용한다.
toEqual
숫자 + 객체나 배열의 값 비교
원시적인 타입(number
, boolean
, string
, null
)을 사용한다면 toBe와 toEqual 사이에 큰 차이점이 없다.
toStrictEqual
엄격한 Equal로 특정 요소에 undefined
를 허용하지 않음
null, define, undefine과 관련된 테스트
toBeNull
Null
인 경우 통과
test("null은 null입니다.", () => {
expect(null).toBeNull();
}); // 테스트 성공
toBeUndefined
Undefined
인 경우 통과
toBeDefined
Defined
인 경우 통과
불리언(boolean)와 관련된 테스트
toBeTruthy
True
인 경우 통과
test("비어있지 않은 문자열은 true입니다", () => {
expect(fn.add("hello","world")).toBeTruthy();
}); // 테스트 성공
toBeFalsy
False
인 경우 통과
test("0은 false입니다.", () => {
expect(fn.add(1,-1)).toBeFalsy();
}); // 테스트 성공
숫자와 관련된 테스트
사용자 입력한 아이디의 길이를 제한하거나, 업로드된 파일의 크기가 적당한지 판별할 때 유용하다.
toBeGreaterThan
크다
toBeGreaterThanOrEqual
크거나 같다
toBeLessThan
작다
toBeLessThanOrEqual
작거나 같다
test("ID는 10자 이하여야 합니다.", () => {
const id = "THE_BLACK_ORDER";
expect(id.length).toBeLessThanOrEqual(10);
}); // 테스트 실패
+) 정확하게 같은지 확인할 때는 앞서 배운 toBe
를 이용한다.
test("비밀번호는 4자리여야 합니다.", () => {
const pw = "1234";
expect(pw.length).toBe(4);
}); // 테스트 성공
문자열과 관련된 테스트
정규표현식과 toMatch
test("Hello World에 a라는 글자가 있나?", () => {
expect("Hello World").toMatch(/a/);
}); // 테스트 실패
test("Hello World에 H라는 글자가 있나?", () => {
expect("Hello World").toMatch(/H/);
}); // 테스트 성공
test("Hello World에 H라는 글자가 있나?", () => {
expect("Hello World").toMatch(/h/);
}); // 테스트 실패 // toMatch는 대소문자를 구분함!
test("Hello World에 H라는 글자가 있나?", () => {
expect("Hello World").toMatch(/h/i);
}); // 테스트 성공 // 대소문자를 구분하지 않도록 마지막에 i 붙이기
배열과 관련된 테스트
toContain
배열에 특정 요소가 있다면 통과
test("유저 리스트에 Mike가 있나?", () => {
const user="Mike";
const userList=["Tom","Mike","Kai"];
expect(userList).toContain(user);
}); // 테스트 성공
예외와 관련된 테스트
fn.js
const fn = {
add: (a,b) => a+b,
makeUser: (name,age) => ({name,age,gender:undefined})
throwErr: () => {
throw new Error("xx");
},
};
module.exports = fn;
toThrow
예외가 발생하면 통과
test("이거 에러 나나요?", () => {
expect(() => fn.throwErr()).toThrow();
}); // 테스트 성공
test("oo 에러 나나요?", () => {
expect(() => fn.throwErr()).toThrow("oo");
}); // 테스트 실패 // oo에러가 아니라 xx에러 발생
test("xx 에러 나나요?", () => {
expect(() => fn.throwErr()).toThrow("xx");
}); // 테스트 성공
그 외 다양한 Matchers
참고
💛 개인 공부 기록용 블로그입니다. 👻