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