DEV Community

mark vachi
mark vachi

Posted on • Edited on

NestJs: สร้าง Unit test สำหรับทดสอบ Service ที่ใช้ typeorm + mysql

ใน task.service.ts ใช้ Repository<Task> ตามแบบของ Typeorm

// task.servic.ts

@Injectable()
export class TaskService {
  constructor(
    @InjectRepository(Task)
    private readonly taskRepository: Repository<Task>,
  ) {}
  ...
}
Enter fullscreen mode Exit fullscreen mode

เราสามารถ config TypeOrmModule.forRoot และ TypeOrmModule.forFeature แบบเดียวกับที่ทำใน AppModule ได้เลย และจะให้ Clean ก็แยกออกมาอีก 1 file เพื่อจะได้ใช้ test กันส่วนอื่นๆ ด้วย

สร้าง src/test-utils/TypeORMMySqlTestingModule.ts

// src/test-utils/TypeORMMySqlTestingModule.ts

import { TypeOrmModule } from '@nestjs/typeorm';

export const TypeORMMySqlTestingModule = (entities: any[]) => [
  TypeOrmModule.forRoot({
    type: 'mysql',
    host: process.env.MYSQL_HOST || 'localhost',
    port: 3306,
    username: process.env.MYSQL_USERNAME || 'nest',
    password: process.env.MYSQL_PASSWORD || 'nest',
    database: process.env.MYSQL_DATABASE || 'test',
    entities: [...entities],
    synchronize: true,
  })
  TypeOrmModule.forFeature([Task]),
];

Enter fullscreen mode Exit fullscreen mode

imports เข้าไปใน TestingModule

// task.service.spac.ts
...
beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [...TypeORMMySqlTestingModule([Task])],
      providers: [TaskService],
    }).compile();

    service = module.get<TaskService>(TaskService);
  });
...
Enter fullscreen mode Exit fullscreen mode

Run test เลย

$ yarn test src/task/task.service.spec.ts
Enter fullscreen mode Exit fullscreen mode

enjoy your test

Ref

Top comments (0)