른록노트
[Javascript] Jest - Using Matchers 본문
Using Matchers
Jest는 "matchers"를 사용하여 다양한 방식으로 값을 테스트할 수 있습니다.
이 문서는 일반적으로 사용되는 몇 가지 matcher를 소개합니다. 전체 목록은 Expect API 문서를 참조하세요.
Common Matchers
값을 테스트하는 가장 간단한 방법은 정확히 같음을 사용하는 것입니다.
test('two plus two is four', () => {
expect(2 + 2).toBe(4);
});
이 코드에서, expect(2+2)는 "excepctaion" 이라는 object를 반환합니다.
일반적으로 call matchers를 제외하고 이러한 expectation object로 많은 작업을 수행하지 않습니다.
이 코드에 있는 .toBe(4)는 matcher입니다.
Jest가 실행되면 모든 실패한 matcher를 추적하여 멋진 오류 메시지를 출력할 수 있습니다.
toBe는 Object.is를 사용하여 정확한 동등성을 테스트합니다. 객체의 값을 확인하려면 대신 toEqual을 사용하세요.
test('object assignment', () => {
const data = {one: 1};
data['two'] = 2;
expect(data).toEqual({one: 1, two: 2});
});
toEqual은 객체 또는 배열의 모든 필드를 재귀적으로 확인합니다.
matcher의 반대를 테스트할 수도 있습니다. (not 사용)
test('adding positive numbers is not zero', () => {
for (let a = 1; a < 10; a++) {
for (let b = 1; b < 10; b++) {
expect(a + b).not.toBe(0);
}
}
});
Truthiness
테스트들에서 종종 undefined와 null, false를 구별해야한다. 하지만 이것들이 다르다는걸 원하지 않을 때가 있습니다.
Jest에는 원하는 것을 명시적으로 설명할 수 있는 도우미가 포함되어 있습니다.
- toBeNull matches only null
- toBeUndefined matches only undefined
- toBeDefined is the opposite of toBeUndefined
- toBeTruthy matches anything that an if statement treats as true
- toBeFalsy matches anything that an if statement treats as false
test('null', () => {
const n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
});
test('zero', () => {
const z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});
코드에서 수행하려는 작업과 가장 정확하게 일치하는 매처를 사용해야 합니다.
Number
숫자를 비교하는 대부분의 방법에는 일치하는 matcher 항목이 있습니다.
test('two plus two', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5);
// toBe and toEqual are equivalent for numbers
expect(value).toBe(4);
expect(value).toEqual(4);
});
부동 소수점 평등의 경우 테스트가 작은 반올림 오류에 의존하는 것을 원하지 않기 때문에 toEqual 대신 toBeCloseTo를 사용하세요.
test('adding floating point numbers', () => {
const value = 0.1 + 0.2;
//expect(value).toBe(0.3); This won't work because of rounding error
expect(value).toBeCloseTo(0.3); // This works.
});
String
toMatch를 사용하여 정규 표현식에 대해 문자열을 확인할 수 있습니다.
test('there is no I in team', () => {
expect('team').not.toMatch(/I/);
});
test('but there is a "stop" in Christoph', () => {
expect('Christoph').toMatch(/stop/);
});
Arrays and iterables
toContain을 사용하여 배열 또는 이터러블에 특정 항목이 포함되어 있는지 확인할 수 있습니다.
const shoppingList = [
'diapers',
'kleenex',
'trash bags',
'paper towels',
'milk',
];
test('the shopping list has milk on it', () => {
expect(shoppingList).toContain('milk');
expect(new Set(shoppingList)).toContain('milk');
});
Exceptions
특정 함수가 호출될 때 오류가 발생하는지 테스트하려면 toThrow를 사용하세요.
function compileAndroidCode() {
throw new Error('you are using the wrong JDK');
}
test('compiling android goes as expected', () => {
expect(() => compileAndroidCode()).toThrow();
expect(() => compileAndroidCode()).toThrow(Error);
// You can also use the exact error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);
});
참고: 예외를 발생시키는 함수는 래핑 함수 내에서 호출해야 합니다. 그렇지 않으면 toThrow 어설션이 실패합니다.
And More
Matchers의 전체 목록은 reference docs를 확인하세요.
참고사이트
진행사항
### 초급
1. 공식 홈페이지에서 개념정리
2. 공식 홈페이지에서 튜토리얼 or 가이드 실습하기 (진행)
### 중반
1. 실제로 프로젝트 만들기
2. 프로젝트 진행하면서 API DOC 찾아보며 정리하기
### 후반
1. 오픈소스 컨트리뷰트