GAミント至上主義

Web Monomaniacal Developer.

NestJS + TypeORMでテスト時のRepository依存エラーをちゃんとする

昨日、思考停止の力技でなんとかしまってたけど、TypeOrmModule.forRootAsyncでテスト用の接続環境を渡し、TypeOrmModule.forFeatureをしっかりやればシンプルな設定で動いたのでメモ。

NestJS + TypeORM でテスト時のRepository依存エラーを力技でなんとかする - GAミント至上主義

Test.createTestingModuleのimporsにテスト接続情報を読ませるTypeOrmModule.forRootAsync()と、必要な全Entityを指定したTypeOrmModule.forFeature()の両方渡すってのがポイント?書いてて、forRootAsyncだけでなんとかできるかもという気もした。

useFactory の nameのところは下記
NestJSでテスト用DB接続を使ったテスト実行時のNest could not find testConnection element エラーの対処 - GAミント至上主義

service 単位のテストの時はcreateTestingModule使わなくていいかなと思ったけど、これで解決できたので使ったほうがいいなってなった。
TypeOrmModule.forFeatureに渡すEntityの配列は、数が多いと毎回書くの大変なのでどこかに書いてexportして共通化した方がよさそう。

import { Test, TestingModule } from '@nestjs/testing'
import { getRepositoryToken, TypeOrmModule } from '@nestjs/typeorm'
import { INestApplication } from '@nestjs/common'
import { getConnectionOptions, Repository } from 'typeorm'
//省略
describe('UsersService', () => {
  let usersService: UsersService
  let userRepository: Repository<User>
  let userProfileRepository: Repository<UserProfile>
  let app: INestApplication

  beforeAll(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [UsersService],
      imports: [
        TypeOrmModule.forRootAsync({
          useFactory: async () => {
            const options = await getConnectionOptions('test')
            return {
              ...options,
              name: null,
            }
          },
        }),
        TypeOrmModule.forFeature([
          User,
          UserProfile,
          ExperiencedCompany,
          // 省略
        ]),
      ],
    }).compile()
    app = module.createNestApplication()
    usersService = app.get<UsersService>(UsersService)
    userRepository = app.get<Repository<User>>(getRepositoryToken(User))
    userProfileRepository = app.get<Repository<UserProfile>>(
      getRepositoryToken(UserProfile),
    )
  })

レポジトリを使いたいときは こんな感じで取り出せた。

userRepository = app.get<Repository<User>>(getRepositoryToken(User))