TIL | Jest 의존성 주입

bubblegum·2024년 3월 28일
0

Today I learn(TIL)

목록 보기
41/84
post-thumbnail

getRepositoryToken

jest에서 getRepositoryToken은 TypeORM과 같은 ORM(Object-Relational Mapping) 라이브러리를 테스트할 때 사용되는 유틸리티 함수입니다. 보통 jest를 사용하여 TypeORM을 테스트할 때, 각각의 엔티티(Entity)에 대한 테스트 더블을 만들고 주입해야 합니다. 이때 getRepositoryToken을 사용하여 해당 엔티티에 대한 테스트 더블을 생성하고 주입할 수 있습니다.

일반적으로 getRepositoryToken은 다음과 같이 사용됩니다:

import { getRepositoryToken } from '@nestjs/typeorm';
import { Test } from '@nestjs/testing';
import { MyEntity } from './my-entity.entity';
import { MyService } from './my-service.service';

describe('MyService', () => {
  let service: MyService;

  beforeEach(async () => {
    const moduleRef = await Test.createTestingModule({
      providers: [
        MyService,
        {
          provide: getRepositoryToken(MyEntity),
          useValue: {}, // Mock your repository here
        },
      ],
    }).compile();

    service = moduleRef.get<MyService>(MyService);
  });

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

위의 예시에서 getRepositoryTokenMyEntity 엔티티에 대한 테스트 더블을 만들기 위해 사용되었습니다. provide 프로퍼티에는 해당 엔티티에 대한 테스트 더블을 제공하기 위한 토큰이 주어졌습니다. 이 토큰은 모듈 구성(configuration)에서 getRepositoryToken(MyEntity)로 호출되어 사용됩니다. 이렇게 함으로써 테스트에서 MyEntity에 대한 모의(mock) 레포지토리를 주입할 수 있습니다.

테스트 더블

"테스트 더블(Test Double)"은 소프트웨어 테스트에서 사용되는 가짜 객체로, 실제 구현을 대체하여 테스트 중에 사용됩니다. 테스트 더블은 다양한 형태를 가질 수 있으며, 주로 테스트에서 다른 객체와의 상호작용을 시뮬레이션하기 위해 사용됩니다.

테스트 더블의 주요 형태는 다음과 같습니다:

  1. 모의 객체(Mock Object): 테스트 더블의 일종으로, 특정 메서드 호출에 대한 응답을 정의하고 해당 호출이 발생했는지 여부를 검증할 수 있습니다. 모의 객체는 주로 외부 의존성을 대체하여 테스트 중에 호출되는 메서드의 동작을 시뮬레이션합니다.

  2. 스텁(Stub): 실제 객체의 대체로 사용되며, 특정 메서드 호출에 대한 고정된 응답을 제공합니다. 스텁은 주로 메서드 호출에 대한 예상된 결과를 반환하도록 구현됩니다.

  3. 스파이(Spy): 실제 객체를 대체하여 특정 메서드의 호출 여부, 호출 횟수, 전달된 인자 등을 관찰합니다. 스파이는 메서드 호출을 모니터링하고 테스트 중에 객체의 상태를 검증하는 데 사용됩니다.

  4. 페이크(Fake): 실제 구현을 대체하는 가짜 구현으로, 실제로 작동하는 구현이지만 간단하고 가벼운 버전입니다. 페이크는 실제 환경과 유사한 동작을 제공하여 테스트를 단순화하는 데 사용됩니다.

이러한 테스트 더블들은 테스트 중에 특정 동작을 시뮬레이션하거나 테스트의 격리성을 유지하기 위해 사용됩니다. 테스트 더블을 사용하면 외부 의존성에 의존하지 않고도 테스트를 작성할 수 있으며, 테스트 중에 발생할 수 있는 예기치 않은 동작을 제어할 수 있습니다.

useFactory

useFactory는 NestJS의 의존성 주입(Dependency Injection) 시스템에서 사용되는 옵션 중 하나입니다. 일반적으로 @Injectable() 데코레이터와 함께 사용되며, 의존성을 제공하기 위해 팩토리 함수를 지정할 때 사용됩니다.

팩토리 함수는 실제 객체를 생성하고 반환하는 함수입니다. useFactory를 사용하면 이러한 팩토리 함수를 지정하여 NestJS가 해당 함수를 호출하여 의존성을 제공할 수 있습니다. 이를 통해 인스턴스화 된 객체를 동적으로 생성하거나 초기화할 수 있습니다.

일반적으로 useFactory를 사용하는 방법은 다음과 같습니다:

import { Injectable } from '@nestjs/common';

@Injectable()
export class MyService {
  constructor(private dependency: Dependency) {}

  // 다른 서비스를 반환하는 팩토리 함수
  static createDependency(): Dependency {
    return new Dependency();
  }
}
import { Module } from '@nestjs/common';
import { MyService } from './my.service';

@Module({
  providers: [
    MyService,
    {
      provide: Dependency,
      useFactory: MyService.createDependency, // MyService 클래스의 createDependency() 함수를 팩토리로 사용
    },
  ],
})
export class MyModule {}

위의 예시에서 useFactoryMyService.createDependency() 메서드를 팩토리 함수로 사용하여 Dependency 클래스의 인스턴스를 생성합니다. 이렇게 하면 NestJS가 Dependency 클래스의 인스턴스를 필요로 할 때마다 해당 팩토리 함수를 호출하여 새로운 인스턴스를 생성합니다.

이렇게 팩토리 함수를 사용하면 객체 생성 과정을 커스터마이징하고, 객체의 생성을 늦추거나 조건부로 수행할 수 있습니다. 이는 의존성 주입을 통해 동적으로 의존성을 관리하고 제공하는 데 유용합니다.

팩토리 함수

팩토리 함수(Factory Function)는 다른 함수를 생성하고 반환하는 함수입니다. 이는 함수형 프로그래밍에서 자주 사용되며, 일반적으로 다양한 목적으로 활용됩니다.

팩토리 함수의 주요 특징은 다음과 같습니다:

  1. 동적 생성: 팩토리 함수는 런타임에 호출되어 동적으로 새로운 값을 생성하고 반환할 수 있습니다. 이를 통해 객체 생성 과정을 동적으로 제어하거나 다양한 조건에 따라 다른 객체를 생성할 수 있습니다.

  2. 재사용 가능: 팩토리 함수는 호출될 때마다 새로운 값을 생성하거나 반환할 수 있지만, 동일한 인수로 여러 번 호출될 때 동일한 결과를 반환할 수도 있습니다. 이는 팩토리 함수를 통해 특정 상태를 기반으로 객체를 생성하고 재사용할 수 있음을 의미합니다.

  3. 캡슐화: 팩토리 함수는 클로저(closure)와 함께 사용될 수 있으며, 외부 범위의 변수를 캡처하여 내부 상태를 유지하고 활용할 수 있습니다. 이는 팩토리 함수가 상태를 가지거나 외부 상태에 의존하는 객체를 생성할 때 유용합니다.

  4. 인수 전달: 팩토리 함수는 다른 함수와 마찬가지로 매개변수를 받아들일 수 있습니다. 이를 통해 동적으로 생성되는 객체의 생성 과정을 조절하거나 사용자 지정 로직을 적용할 수 있습니다.

팩토리 함수는 다양한 프로그래밍 시나리오에서 사용됩니다. 예를 들어, 의존성 주입(Dependency Injection) 프레임워크에서는 팩토리 함수를 사용하여 객체를 동적으로 생성하고 제공합니다. 또한 객체 생성을 추상화하여 복잡성을 줄이고 유연성을 높이는 데 유용하게 사용됩니다.

profile
황세민

0개의 댓글

관련 채용 정보