DEV Community

mark vachi
mark vachi

Posted on • Edited on

1

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)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay