昨日、思考停止の力技でなんとかしまってたけど、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))