른록노트

[Javascript] Jest - Using Matchers 본문

Programming/[Javascript]

[Javascript] Jest - Using Matchers

른록 2021. 12. 4. 18:18

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를 확인하세요.

참고사이트

공식사이트 Using Matchers v27.2

진행사항

### 초급

1. 공식 홈페이지에서 개념정리 
2. 공식 홈페이지에서 튜토리얼 or 가이드 실습하기 (진행)

### 중반

1. 실제로 프로젝트 만들기
2. 프로젝트 진행하면서 API DOC 찾아보며 정리하기

### 후반

1. 오픈소스 컨트리뷰트
반응형
Comments