본문 바로가기
카테고리 없음

TestCode: 유닛 테스트 | Jest - Mock Functions 으로 함수 모의 테스트

by nomfang 2023. 7. 13.
728x90
반응형

모의 함수 (Mock Functions)

모의 함수를 사용하면 함수의 실제 구현을 지우고
함수에 대한 호출 및 해당 호출에서 전달된 매개변수를 캡쳐하고
new 로 인스턴스화 될 때 생성자 함수의 인스턴스를 캡쳐하여 값을 반환한다.......?

모의 함수를 사용하는 두 가지 방법

  • 테스트 코드에서만 사용할 모의 함수를 생성하여 사용하거나
  • Manual Mocks 를 작성하여 모듈 종속성을 재정의 한다

모의 함수 생성하여 사용

const mockCallback = jest.fn(x => 42 + x); // 모의 함수 

test('forEach mock function', () => {
  forEach([0, 1], mockCallback);

  // The mock function was called twice
  expect(mockCallback.mock.calls).toHaveLength(2);

  // The first argument of the first call to the function was 0
  expect(mockCallback.mock.calls[0][0]).toBe(0);

  // The first argument of the second call to the function was 1
  expect(mockCallback.mock.calls[1][0]).toBe(1);

  // The return value of the first call to the function was 42
  expect(mockCallback.mock.results[0].value).toBe(42);
});

.mock property

모든 모의 함수에는 함수가 호출된 방법과 함수가 반환한 내용에 대한 데이터를 보관하는 특수 속성 .mock 이 있다
.mock 속성은 각 호출에 대한 this 값도 추적하므로 다음과 같이 테스트할 수도 있다

const myMock1 = jest.fn();
const a = new myMock1();
console.log(myMock1.mock.instances);
// > [ <a> ]

const myMock2 = jest.fn();
const b = {};
const bound = myMock2.bind(b);
bound();
console.log(myMock2.mock.contexts);
// > [ <b> ]

mock property 는 함수가 어떻게 호출되고 인스턴스화되는지 또는 반환되는 내용을 확인하는 테스트에서 매우 유용하다

Mock Return Values

모의 함수를 사용하여 테스트 중 테스트 값을 코드에 주입할 수도 있다

const myMock = jest.fn();
console.log(myMock());
// > undefined

myMock.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true);

console.log(myMock(), myMock(), myMock(), myMock());
// > 10, 'x', true, true

Mock functions 은 함수형 프로그래밍의 continuation-passing style 코드에서도 효과적이다
실제 동작을 재현하기 위해 필요한 복잡한 과정을 피할 수 있다

const filterTestFn = jest.fn();

// Make the mock return `true` for the first call,
// and `false` for the second call
filterTestFn.mockReturnValueOnce(true).mockReturnValueOnce(false);

const result = [11, 12].filter(num => filterTestFn(num));

console.log(result);
// > [11]
console.log(filterTestFn.mock.calls[0][0]); // 11
console.log(filterTestFn.mock.calls[1][0]); // 12

반응형

댓글