Jest

JEST - Expect API (1)

training center 2021. 5. 29. 20:38

테스트 코드를 작성할때 자주쓰는 또는 유용한 API 정리

 

Expect : 테스트 코드를 작성할때, 값이 특정한 조건에 맞는지 확인해야한다.

expect는 다양한 것을 검증할 수 있는 여러 "matchers"를 제공한다.

 

Reference

expect(value)

- expect 함수는 값을 테스트 할 때마다 사용된다. expect 그 자체만으론 거의 호출되지 않는다.

반면, 값을 검증하기 위해 "matcher" 함수와 함께 expect를 사용할 수 있다.

test('the best flavor is grapefruit', () => {
  expect(bestLaCroixFlavor()).toBe('grapefruit');
});

이 경우에서 tobe는 matcher 함수이다. 

 

.not

- 테스트 방법을 알고있다면 .not은 그 반대를 테스트한다. 

test('the best flavor is not coconut', () => {
  expect(bestLaCroixFlavor()).not.toBe('coconut');
});

.resolves

- resolves 를 사용하여 promise로 값을 받는다면 다른 matcher를 연결할 수 있다. 만약 promise가 reject되면 실패한다.

예를 들어, 아래 코드는 promise로 resolves 되어 결과값이 "lemon"인지 테스트한다.

test('resolves to lemon', () => {
  // make sure to add a return statement
  return expect(Promise.resolve('lemon')).resolves.toBe('lemon');
});

promise를 테스트할때 테스트는 비동기적으로 작동된다. 따라서 jest에게 값을 반환하기 전까지 대기하라고 전달해야 한다. 이때, async/await을 .resolves와 조합하여 쓴다.

test('resolves to lemon', async () => {
  await expect(Promise.resolve('lemon')).resolves.toBe('lemon');
  await expect(Promise.resolve('lemon')).resolves.not.toBe('octopus');
});

.rejects 

- promise가 어떤 이유로 reject되면 다른 "matcher"를 연결하여 쓸 수 있다. 

test('rejects to octopus', () => {
  // make sure to add a return statement
  return expect(Promise.reject(new Error('octopus'))).rejects.toThrow(
    'octopus',
  );
});

async/await을 조합하여 쓸 수 있다.

test('rejects to octopus', async () => {
  await expect(Promise.reject(new Error('octopus'))).rejects.toThrow('octopus');
});

.toBe(value)

- 원시 값을 비교하거나 객체안에 값을 확인할 수 있다.

const can = {
  name: 'pamplemousse',
  ounces: 12,
};

describe('the can', () => {
  test('has 12 ounces', () => {
    expect(can.ounces).toBe(12);
  });

  test('has a sophisticated name', () => {
    expect(can.name).toBe('pamplemousse');
  });
});

.toBe를 소수점 숫자에 사용하면 안된다. 반올림때문에, 자바스크립트에서 0.2 + 0.1 은 0.3과 정확히 같지 않다.

소수점 숫자 테스트를 원한다면, .toBeCloseTo를 써야한다.

.toHaveBeenCalled()

- .toHaveBeenCalled()를 사용하여 mock 함수를 호출하였는지 확인할 수 있다.

function drinkAll(callback, flavour) {
  if (flavour !== 'octopus') {
    callback(flavour);
  }
}

describe('drinkAll', () => {
  test('drinks something lemon-flavoured', () => {
    const drink = jest.fn();
    drinkAll(drink, 'lemon');
    expect(drink).toHaveBeenCalled();
  });

  test('does not drink something octopus-flavoured', () => {
    const drink = jest.fn();
    drinkAll(drink, 'octopus');
    expect(drink).not.toHaveBeenCalled();
  });
});

.toHaveBeenCalledTimes(number)

- .toHaveBeenCalledTimes()를 사용하여 mock함수가 정확한 횟수만큼 호출되었는지 확인할 수 있다.

test('drinkEach drinks each drink', () => {
  const drink = jest.fn();
  drinkEach(drink, ['lemon', 'octopus']);
  expect(drink).toHaveBeenCalledTimes(2);
});

.toHaveReturned()

- .toHaveReturned()를 사용하여 mock 함수가 성공적으로 반환되었는지를 테스트한다. (오류가 발생하지 않았는지)

test('drinks returns', () => {
  const drink = jest.fn(() => true);

  drink();

  expect(drink).toHaveReturned();
});

.toHaveLength(number)

- .toHaveLength() 를 사용하여 객체, 배열, 문자열의 size를 확인할 수 있다.

expect([1, 2, 3]).toHaveLength(3);
expect('abc').toHaveLength(3);
expect('').not.toHaveLength(5);

'Jest' 카테고리의 다른 글

JEST - 기본설정  (0) 2021.05.23