Jest Mocking Part.1

김동현·2024년 3월 4일

테스트코드

목록 보기
3/7
post-thumbnail

Mock?

mock
1.동사 (특히 흉내를 내며) 놀리다[조롱하다] (=make fun of)
2.동사 격식 무시[경시]하다
3.형용사 거짓된, 가짜의 (=sham)
4.형용사 격식 모의의

Mocking을 하는 목적은 우리가 컨트롤 할 수 없는 무엇인가를 대체하기 위함이다.
Jest의 모킹 함수를 만드는 가장 쉬운 방법은 jest.fn()을 사용하는 것이다.

test('기본적으로 Undefined를 반환합니다.', () => {
  const mock = jest.fn();

  const result = mock('foo');

  expect(result).toBeUndefined(); 
  expect(mock).toHaveBeenCalled();
  expect(mock).toHaveBeenCalledTimes(1);
  expect(mock).toHaveBeenCalledWith('foo');
});

Return Value와 구현부, Promise로도 변경이 가능합니다.
또한 한번만 모킹 함수를 사용할 수 있도록 할 수도 있습니다.

test('기본적으로 Undefined를 반환합니다.', () => {
  const mock = jest.fn();

  const result = mock('foo');

  expect(result).toBeUndefined();
  expect(mock).toHaveBeenCalled();
  expect(mock).toHaveBeenCalledTimes(1);
  expect(mock).toHaveBeenCalledWith('foo');
});

test('모의 구현', () => {
  const mock = jest.fn((val) => 'bar');

  expect(mock('foo')).toBe('bar');
  expect(mock).toHaveBeenCalledWith('foo');
});

test('모의 구현 V2', () => {
  const mock = jest.fn().mockImplementation((val) => 'bar');

  const result = mock('foo');
  expect(result).toBe('bar');
  expect(mock).toHaveBeenCalledWith('foo');
});

test('모의 구현 한 번만 사용하기', () => {
  const mock = jest.fn().mockImplementationOnce((val) => 'bar');

  const result = mock('foo');
  expect(result).toBe('bar');
  expect(mock).toHaveBeenCalledWith('foo');

  const result2 = mock('baz');
  expect(result2).toBe(undefined);
  expect(mock).toHaveBeenCalledWith('baz');
});

test('반환 값 모킹하기', () => {
  const mock = jest.fn();
  mock.mockReturnValue('bar');

  const result = mock('foo');
  expect(result).toBe('bar');
  expect(mock).toHaveBeenCalledWith('foo');
});

test('Promise 모킹하기', () => {
  const mock = jest.fn();
  mock.mockResolvedValue('bar');

  const result = mock('foo');
  expect(result).resolves.toBe('bar');
  expect(mock).toHaveBeenCalledWith('foo');
});

🤔 언제 모킹을 해야 할까?

  1. 환경과 맥락에 따라서 사용한다.
    사용자 구매 목록을 확인하기 위해 관련 없는 인증 절차를 거치지 않고 이미 인증된 사용자를 모킹할 수 있다.
  2. API 통신
    결제 프로세스를 테스트 할 때 실제 구매가 이루어지고 비용이 청구되는 것을 원하지 않을 때 모킹할 수 있다.
  3. 외부 종속성
    외부 라이브러리 또는 SDK들의 Payload와 반응에 대해 모킹할 수 있다.

Mock의 주의점

테스트의 목적은 개발 중인 시스템에 대한 확신을 가지기 위함이다.
모킹을 많이 할 수록 원래의 시스템 기능에서 벗어날 가능성이 높아진다. 모킹하는 것에 대한 편차가 존재하기 때문이다. 그렇기에, 적절한 시점에 모킹하기 적합한 것을 선정하는 것이 중요하다.

참고 자료

profile
달려보자

0개의 댓글