상똥이의 Back-End 공부방

[Jest] 테스트코드 환경 설정, prisma mocking 본문

Jest

[Jest] 테스트코드 환경 설정, prisma mocking

상똥백 2024. 5. 4. 19:01

[Jest 환경 세팅]

1. jest 설치하기

- nest의 경우 이미 설치가 되어있지만, express 등은 설치가 필요하다

- 테스팅은 개발 환경에서만 진행할 것이므로, -D 옵션을 사용한다

npm i -D jest

 

 

2. jest-mock 설치하기

- 인터페이스나 객체를 복사하기 위해 jest-mock-extended를 설치한다

npm i jest-mock-extended --save-dev

 

※ mock객체를 사용하는 이유 ↓

1) 격리된 테스트 환경 제공 : mock을 사용하면 외부 서비스나 데이터베이스같은 실제 환경에 의존하지 않고 테스틀를 수행할 수 있음 → 이로 인해 테스트가 더 빠르고 예측 가능하며 안정적으로 실행됨

2) 상태 제어와 예측 : mock객체는 특정 메소드 호출에 대해 사전에 정의된 반응을 반환할 수 있음. 예를 들어 데이터베이스 조회 함수를 호출할 때 특정 데이터를 반환하도록 설정 가능 → 이로 인해 테스트 케이스에서 원하는 시나리오를 정확히 테스트할 수 있도록 도움

3) 부작용 최소화 : 실제 서비스를 사용할 때 발생할 수 있는 부작용(예: 데이터베이스에 불필요한 데이터 삽입)을 방지할 수 있음. mock을 사용함으로써 데이터베이스나 파일 시스템을 실제로 변경하지 않고도 해당 함수가 호출되었는지, 올바른 매개변수로 호출되었는지 등을 확인할 수 있음

4) 실행 속도 향상 : 실제 의존성(예: 외부 API호출, 데이터베이스 접근) 대신 가벼운 mock객체를 활용하면 테스트 실행 속도가 향상됨

 

3. 절대경로를 사용할 수 있도록 환경 세팅

- typescript를 사용하는 경우 

- 절대경로를 사용할 수 있도록 설정하기 위해 아래 package.json 설정을 따른다

- "rootDir": ".",

- "modulePaths": ["<rootDir>"]

 

[mocking]

1. DeepMockProxy

- jest-mock-extended 라이브러리의 일부

- 객체의 심층적인 mock을 제공

- 객체가 제공해야 하는 메서드나 속성들을 모두 포함한 mock 인스턴스를 만들 수 있음

※ 장점

1) 객체의 모든 메서드와 속성에 대해 깊은 수준의 mocking을 자동으로 제공, 내부 객체까지도 mock객체로 생성해줌

2) Typescript를 사용하는 경우 타입 안정성을 유지

3) 각각의 mock 메서드는 jest의 mock함수를 사용하여 구현되므로 이를 통해 특정 메서드 호출에 대해 반환값을 설정하거나 호출 여부를 검증하고 호출 시 전달된 인자를 확인하는 등의 다양한 테스트 케이스를 손쉽게 구성할 수 있음

4) 복잡한 의존성을 가진 컴포넌트를 테스트할 때 DeepMockProxy를 사용하면 실제 의존성을 격리시켜 테스트할 수 있어 다른 외부 요인에 의해 영향을 받지 않도록 보장

- 사용 예시

import { ConfigService } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';
import { PrismaClient } from '@prisma/client';
import { DeepMockProxy, mockDeep } from 'jest-mock-extended';
import { PrismaService } from 'src/database/prisma/prisma.service';
import { MatchesService } from './matches.service';

describe('MatchesService', () => {
  let service: MatchesService;
  let prismaMock: DeepMockProxy<PrismaClient>;
  let configMock: DeepMockProxy<ConfigService>;

  beforeEach(async () => {
    prismaMock = mockDeep<PrismaClient>();
    configMock = mockDeep<ConfigService>();

    const module: TestingModule = await Test.createTestingModule({
      providers: [
        MatchesService,
        {
          provide: PrismaService,

          useValue: prismaMock,
        },
        {
          provide: ConfigService,

          useValue: configMock,
        },
      ],
    }).compile();

    service = module.get<MatchesService>(MatchesService);
  });

  test('should be defined', () => {
    expect(service).toBeDefined();
  });
});

 

'Jest' 카테고리의 다른 글

[Jest] DTO 테스트코드 작성  (0) 2024.05.09