본문 바로가기

과거공부모음

20230228 TIL - nestjs 유닛테스트

Today I learned

테스트 코드 작성 중 문제가 발생했다

Nest can't resolve dependencies of the PhotospotService (?, S3Service). Please make sure that the argument PhotospotRepository at index [0] is available in the RootTestModule context.

의존성 주입을 위해서 module에다가 세팅을 해주는 부분이 있는데 테스트를 할 때 mock module을 만드는데 그 부분에 세팅해 주지 않아서 발생하는 문제인듯 하다

 

 

해결해보도록 하자

const app: TestingModule = await Test.createTestingModule({
      imports: [
        ConfigModule.forRoot({ isGlobal: true }),
        TypeOrmModule.forRootAsync({ useClass: TypeOrmConfigService }),
        TypeOrmModule.forFeature([Photospot]),
        NestjsFormDataModule.config({
          storage: FileSystemStoredFile,
          autoDeleteFile: false,
        }),
      ],
      controllers: [PhotospotController],
      providers: [
        PhotospotService,
        S3Service,
        S3ServiceProvider
      ],
    }).compile();

 

필요한 것들을 모두 imports해주고 controllers와 providers도 세팅을해주면 문제가 해결된다

 

 

service 테스트 코드를 작성하고 테스트를 진행하는데 문제가 발생했다

Repository가 진짜로 실행이 되어서 데이터베이스에 접근하는 문제가 발생했다

 

 

문제를 해결하기 위해서 service를 mock Repository를 이용해 속이는 세팅이 필요하다

이 문제를 해결하기 위해서는 패키지가 하나 필요하다

npm install --save-dev sinon @types/sinon

sinon은 테스트를 도와주는 라이브러리다

 

 

sinon의 sandbox와 typeorm의 getRepositoryToken를 이용해서 모의 데이터베이스를 연결해서 가짜 Repository에 접근하게 세팅해서 데이터베이스에 접근하지 않게 만들면 문제는 해결이다

let sandbox: sinon.SinonSandbox;

  beforeAll(async () => {
    sandbox = sinon.createSandbox();

// 생략

providers: [
        PhotospotService,
        S3Service,
        S3ServiceProvider,
        {
          provide: getRepositoryToken(Photospot),
          useValue: sinon.createStubInstance(Repository),
        },
      ],

// 생략