toBeCalledWith

Sinf·2022년 4월 11일
0

고민의 흔적

목록 보기
15/38

Jest로 단위테스트

그동안 supertest를 통해 통합테스트를 작성해왔다.
통합테스트로도 테스트 코드의 장점을 많이 느낄 수 있었다.
다만 더 세밀한 테스트 타겟 지정, TDD 등 다양한 이유로 단위테스트의 필요를 느꼈다.

Jest를 통한 단위테스트를 공부하면서, 익숙하지 않아 힘들다.
조금씩 정리하면서 내 것으로 만들고자 한다.

Mock

Mock은 구글 번역 시 모조품, 가짜라는 뜻을 가진 단어이다.

단위 테스트에서는 Mock 함수, 실제로 실행되지 않고 실행되는 척하는 가짜 함수를 Mock 함수라고 한다.

Jest에서는 다음과 같이 Mock 함수를 생성할 수 있다.

User.create = jest.fn()

User.create는 이제 실제 User.create가 실행되는 것이 아니라 원하는대로 실행되는 가짜 함수로 선언된 것이다.

toBeCalledWith

특정 함수의 호출여부와 파라미터를 테스트할 때 사용하는 Matcher이다.

Matcher는 Jest에서 expect를 통해 값을 검증할 때, 해당 값을 검증하기 위한 도구이다. toEqual, toBe, toBeTruthy 등등 다양한 Matcher가 존재한다.

해당 Matcher는 Jest에서 Mock 함수를 사용해 테스트할 때, 해당 Mock 함수의 호출 시 특정 인자 값과 함께 사용되었는지에 대한 테스트 Matcher이다.

// Mock 함수
User.create = jest.fn()

const user = {
  name: "sinf"
}

req.body = user;

it("User.create called", async () => {
  // req, res는 node-mocks-http 를 통해 생성된 Mock 객체
  await userController.createUser(req, res, next);
  expect(User.create).toBeCalledWith(user)
})

위 코드는 userControllercreateUser를 테스트할 때, User.create의 함수가 호출되었는지, 그 호출될 때, user 값과 함께 호출되었는지 확인하는 테스트 코드이다.

이를 통해 createUser 로직 내에서 User.createuser 값을 인자로 받아 호출되는지 실제 User.create 실행 없이 테스트할 수 있다.

toBeCalledWith vs toHaveBeenCalledWith

테스트 코드를 찾아보다보니 toBeCalledWith를 사용한 테스트 코드가 있고, toHaveBeenCalledWith를 사용한 테스트 코드가 있다.

비슷한 이름으로 같은 역할로 사용하는 것 같아 찾아보았는데,

스택 오버플로우에 Jest Difference Between toBeCalledWith and toHaveBeenCalledWith

결국 Jest에서 정의된 부분을 찾아보면 두 개의 Matcher 모두 createToBeCalledWithMatcher로 생성되기 때문에 차이가 없다는 것.

같은 역할을 한다면 toBeCalledWith가 나은 것 같아 다음부턴 toBeCalledWith를 사용하기로 했다.

단위테스트

단위테스트, Mock 처음 시작할 땐 막막하고 익숙한 supertest만 사용하고 싶었다.

막상 Mock에 대해서 공부하고 사용해보니 시작도 못할 것은 아니었다.

함수의 존재여부, 함수가 호출하는 함수, 그 전달되는 인자, 응답 등등 하나씩 쪼개어 테스트하는 것.

다만 클린코드에 설명과 같이 너무 많은 단위테스트는 오히려 역효과이니 알잘딱깔쎈

반성 끼워팔기

최근 과제, 면접 준비, 코테 등등 여러가지 변명거리로 대충 지나가는 시간들이 많았다.

아직 내 코드에는 부족한 점이 많다.
천천히 하나씩 다만 낭비없이 잘 정리하고 배워서 더 좋은 개발자가 되자.

profile
주니어 개발자입니다. 🚀

0개의 댓글