toBe 보통 원시값을 비교할 때 toEqual은 보통 객체의 값을 비교할 때 쓰인다. 객체의 깊은 복사(depth가 깊은 프로퍼티)까지도 같은지 검사한다. toEqual()이 적절하다.jest에서 모듈과 함수를 mocking하는 3가지 방법이 있다.
jest.fn() vs jest.spyOn() vs jest.mock()
jest.fn()jest.fn()는 가짜 함수를 새로 생성한다.const mockFn = jest.fn();
mockFn.mockReturnValue("I am a mock!");
가장 기본적인 jest.fn() 은 다른 모킹 함수에 비해 덜 쓰인다. 왜냐하면 jest.fn()외에 모킹 함수들은 다음과 같은 장점을 가지고 있기 때문이다.
jest.mock()은 자동적으로 모듈의 모든 함수를 모킹한다. jest.spyOn() 또한 모든 함수를 mocking 하면서 원래의 함수를 복원하기도 한다. jest.fn()을 사용하면 실제로 프로덕션 코드의 함수가 실행되는 것이 아니고, 가짜 함수만 실행된다.
(진짜 함수는 빈껍대기가 되고, 가짜 함수의 내용으로 바뀌어 버렸다.)
따라서 실제 함수에서 일어날 수 있는 예상치 못한 에러를 지나칠 수 있는 문제가 있다.
이런 경우에는 jest.fn()을 사용하지 않고 jest.spyOn()을 사용하면 된다. jest.spyOn()은 기존 함수의 작동은 유지하되 해당 함수의 결과값을 가짜로 대체해준다. 직접 프로덕션 코드를 사용하되, spyOn()을 하고, 가짜 반환값을 반환하게 하여 테스트를 작성하게 할 수 있다.
jest.spyOn()jest.spyOn('객체 이름', 함수 이름)
spyOn의 첫번째 이름에는 클래스, 혹은 파일명이 들어간다.
만약 해당 함수가 객체 안에 없다면, 그 함수가 있는 파일의 이름을 지정해 객체 이름에 넣어준다.
import * as missionUtils from '../src/Utils/MissionUtils.js';
///사용할 때
const mockMakeRandomNum = jest.spyOn(missionUtils, 'makeRandomNum');
spyOn은 프로덕션 코드의 실제 함수를 보존함으로써 특정한 사이드 이펙트가 있는지 검사하는 데 유용하다. 함수를 모킹한 뒤에 .mockRestore() 를 사용하면, 원래 함수로 복원시킬 수도 있다.
jest.mock()jest.mock()은 파일안에 있는 함수를 자동으로 다 모킹해서, 더욱 편하게 쓸 수 있다.
jest.fn()과 spyOn()에서 모두 쓸 수 있다.import * as math from "./math";
jest.mock("./math.js");
.mockReturnValue(value)const mockMakeRandomNum = jest.spyOn(missionUtils, 'makeRandomNum');
mockMakeRandomNum.mockReturnValue(7);
.mockReturnValue(value)const outputMock = [true, false, true, true];
outputMock.forEach(output => {
mockIsForward.mockReturnValueOnce(output);
});
.mockImplemetation(value)const mockFn = jest.fn();
mockFn.mockImplementation((name) => `I am ${name}`);
테스트트에서 제어할 수 없는 값에 의존하는 함수의 경우는 테스트 하기 어렵다.
제어할 수 없는 값은 다음과 같다.
이런 제어할 수 없는 값을 함수들은 순수하지 않다. 따라서, 이런 값들은 인자로 받아 항상 같은 값을 반환하는 순수함수를 만들도록 노력해야 한다.
이런 순수 함수는 제어할 수 없는 값을 인자로 외부에서 넣어줌으로써 만들 수 있다. 인자가 너무 많아지는 고민이 든다면, 기본값을 적절히 활용하자.
https://jojoldu.tistory.com/676?category=1036934
[번역] Jest Mocks에 대한 이해
https://minoo.medium.com/%EB%B2%88%EC%97%AD-jest-mocks%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4-34f75b0f7dbe
Jest와 Mocking을 통한 Unit Test
https://velog.io/@kisuk623/Jest%EC%99%80-Mocking%EC%9D%84-%ED%86%B5%ED%95%9C-Unit-Test