티스토리 뷰

무엇인가? (아시겠지만 이 포스트는 jest의 nodejs 환경, 조금 더 명확하게는 commonjs 모듈 환경에서의 이야기입니다.)

 

jest는 테스트 대상 메소드 혹은 테스트 대상 모듈을 제외하고 모킹을 통해 변인을 통제합니다.

모킹된 메소드는 아무런 동작도 하지 않습니다. 나중에 모킹 메소드의 데이터 프로퍼티에 접근, 이 모킹 메소드가 몇 번 호출되었는지? 어떤 인자들이 입력되었는지? 와 같은 어서션을 수행합니다.

모킹된 메소드는 아무 동작도 하지 않는 것이 기본이지만, jest.mock의 두 번째 매개변수 factory를 통해 모듈 내 특정 메소드의 반환 값을 제어할 수도 있습니다.

 

설정 파일인 jest.config.js에서 automock 항목을 true로 지정하면 test 환경 내에서의 모든 모듈 및 추출export 메소드가 모킹됩니다. 저는 같은 말을 반복하고 있군요. automock 항목의 기본값은 false입니다.

 

앗, 그런데 jest 객체에는 jest.requireMockjest.requireActual 메소드가 있습니다. 그렇다면 이것은 무엇입니까? require를 써야할지 requireMock을 써야할지 혼란스럽습니다.

 

automock 기능을 통해 모든 모듈이 기본적으로 모킹되었거나, jest.mock 메소드를 가지고 명시적으로 모킹된 모듈의 경우에는 require, requireMock 두 선언이 같은 객체를 반환합니다.

const MY_FIRST_MODULE = "../myFirstModule";

jest.mock(MY_FIRST_MODULE);

it("명시적 모킹", () => {
  const resolvedByRequire = require(MY_FIRST_MODULE);
  const resolvedByJestRequireMock = jest.requireMock(MY_FIRST_MODULE);
  expect(resolvedByRequire).toEqual(resolvedByRequireMock);
});

그렇지 않은 경우에는, 그러니까 automock 기능이 제거되었을 경우에는 require, requireActual의 두 선언이 같은 객체를 반환합니다.

const MY_SECOND_MODULE = "../mySecondModule";

it("모킹 없음", () => {
  const resolvedByRequire = require(MY_SECOND_MODULE);
  const resolvedByJestRequireActual = jest.requireActual(MY_SECOND_MODULE);
  const resolvedByJestRequireMock = jest.requireMock(MY_SECOND_MODULE);
  expect(resolvedByRequire).toEqual(resolvedByJestRequireActual);
  expect(resolvedByRequire).not.toEqual(resolvedByRequireMock);
});

테스트 자신의 automock 환경에 따라 다릅니다. 다만 저는 automock 기능을 사용하지 않고, 필요한 메소드에 대해서만 모킹을 명시적으로 사용하고 있습니다. 그렇기 때문에 require와 jest.requireActual 만으로 충분합니다만, 때때로 명시적으로 "이 객체는 모킹된 모듈이야."와 같은 플래깅을 위해 jest.requireMock을 사용하는 경우도 있습니다.

 

테스트 대상 메소드는 require로 주입import 합니다. (한 테스트 스크립트에서 그것을 모킹하지는 않을 것입니다.)

모킹이 필요한 모듈 및 메소드는, jest.mock으로 선언 후 jest.requireMock으로 주입합니다.

위 모킹된 모듈 및 메소드 중 실제 모듈의 메소드가 필요한 경우에만 jest.requireActual로 주입합니다.

(문서 끝)

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크