[Jest] Mock Sentry functions

개요

회사에서 에러 로그 수집 시스템으로 Sentry를 사용하고 있다.

백엔드 테스트 코드 작성중, Sentry를 Mocking할 필요가 생겼고, 약간의 삽질도 한 겸, 정리해본다.

 

우리 회사는 Nest.js 백엔드를 사용하고 있다.

따라서 아래 문서는 Nest.js를 기준으로 설명한다.

How to

우리는 Sentry를 위해 @ntegral/nestjs-sentry 패키지를 사용하고 있다.

테스트 코드에서 아래와 같이 mocking을 할 수 있다.

# some.service.spec.ts

import { SENTRY_TOKEN, SentryService } from '@ntegral/nestjs-sentry';
import { MockSentryService } from '{path}/sentry.service.mock';

describe('SomeService', () = {
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        SentryService,
        {
          provide: SENTRY_TOKEN,
          useValue: MockSentryService,
        },
      ],
    }).compile();
  });
});

MockSentryService의 구현체는 다음과 같다.

import * as Sentry from '@sentry/node';

jest.mock('@sentry/node');
jest.spyOn(Sentry, 'captureException').mockImplementation();

export const MockSentryService = {
  instance: () => Sentry,
  captureException: Sentry.captureException as jest.MockedFunction<typeof Sentry.captureException>,
};

이렇게 하면 Sentry의 captureException 함수를 모킹할 수 있다.

감상

요즘 일이 많아서 정신이 없어서 그런가... 이런 간단한 문제를 한참 헤맸다.

참고로 @sentry/node 를 직접 쓰는 경우, 더 간단히 모킹이 가능하다.