0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng dẫn Chi Tiết về Testing trong NestJS: Bảo Đảm Chất Lượng Ứng Dụng của Bạn

Đăng vào 2 tuần trước

• 5 phút đọc

Testing trong NestJS: Tại Sao và Làm Thế Nào?

Testing là một bước quan trọng trong quy trình phát triển phần mềm, giúp đảm bảo rằng ứng dụng của bạn hoạt động một cách hiệu quả và ổn định. Trong bài viết này, chúng ta sẽ khám phá NestJS, một framework phổ biến trong việc phát triển ứng dụng Node.js, và phương pháp kiểm thử đi kèm với nó.


1. Tại Sao Testing Lại Quan Trọng Trong NestJS?

Testing không chỉ giúp phát hiện lỗi sớm mà còn cải thiện chất lượng mã nguồn, tăng cường khả năng bảo trì và hỗ trợ phát triển tính năng mới một cách dễ dàng hơn. Với NestJS, việc kiểm thử trở nên thuận tiện nhờ sự tích hợp các công cụ và phương pháp hiện đại.

Các Loại Testing Trong NestJS

  1. Unit Testing: Kiểm tra các thành phần nhỏ nhất trong ứng dụng như service, controller, pipe và guard. Mục tiêu là kiểm tra logic độc lập của từng thành phần mà không bị ảnh hưởng bởi các yếu tố bên ngoài.

  2. Integration Testing: Kiểm tra sự tương tác giữa các thành phần khác nhau của ứng dụng, thông qua việc thực hiện các yêu cầu HTTP đến các endpoints cụ thể.

  3. E2E Testing (End-to-End): Kiểm tra toàn bộ ứng dụng như một tổng thể, tương tự như cách người dùng tương tác với ứng dụng. Điều này giúp đảm bảo rằng mọi thứ hoạt động một cách mượt mà từ đầu đến cuối.


2. Các Công Cụ và Phương Pháp Testing Trong NestJS

Như đã đề cập, NestJS cung cấp một số công cụ hữu ích cho việc kiểm thử:

  • Jest: Đây là framework kiểm thử mặc định được sử dụng với NestJS, cho phép viết và chạy các bài test một cách dễ dàng.
  • Testing Utilities: Bao gồm các hàm như Test.createTestingModuleTest.createModuleBuilder, giúp bạn tạo mô-đun thử nghiệm đơn giản và hiệu quả.

3. Hướng Dẫn Viết Unit Tests

Ví Dụ: Kiểm Tra một Service (UsersService)

typescript Copy
@Injectable()
export class UsersService {
  getUserById(id: number): string {
    return `User with ID ${id}`;
  }
}

Tạo file kiểm thử:

typescript Copy
import { Test, TestingModule } from '@nestjs/testing';
import { UsersService } from './users.service';

describe('UsersService', () => {
  let service: UsersService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [UsersService],
    }).compile();

    service = module.get<UsersService>(UsersService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  it('should return user by ID', () => {
    const userId = 1;
    const result = service.getUserById(userId);
    expect(result).toBe('User with ID 1');
  });
});

Mocking Dependencies

Khi service của bạn phụ thuộc vào một repository, bạn sẽ cần phải mock nó trong bài test:

typescript Copy
@Injectable()
export class UsersService {
  constructor(private readonly usersRepository: UsersRepository) {}

  getUserById(id: number): string {
    return this.usersRepository.findUserById(id);
  }
}

Thực hiện Mock trong Test:

typescript Copy
describe('UsersService with Mock', () => {
  let service: UsersService;
  const mockRepository = {
    findUserById: jest.fn((id) => `Mocked User with ID ${id}`),
  };

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UsersService,
        { provide: UsersRepository, useValue: mockRepository },
      ],
    }).compile();

    service = module.get<UsersService>(UsersService);
  });

  it('should return mocked user by ID', () => {
    const userId = 2;
    const result = service.getUserById(userId);
    expect(result).toBe('Mocked User with ID 2');
  });
});

4. Kiểm Tra Controllers

Ví Dụ: thử nghiệm một controller (UsersController)

typescript Copy
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get(':id')
  getUserById(@Param('id') id: number): string {
    return this.usersService.getUserById(id);
  }
}

Tạo test cho controller:

typescript Copy
describe('UsersController', () => {
  let controller: UsersController;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UsersController],
      providers: [
        {
          provide: UsersService,
          useValue: {
            getUserById: jest.fn((id) => `Mocked User with ID ${id}`),
          },
        },
      ],
    }).compile();

    controller = module.get<UsersController>(UsersController);
  });

  it('should return user by ID', () => {
    const userId = 3;
    const result = controller.getUserById(userId);
    expect(result).toBe('Mocked User with ID 3');
  });
});

5. E2E Testing

E2E testing sẽ khởi chạy toàn bộ ứng dụng và thực hiện các yêu cầu HTTP để đảm bảo mọi thứ hoạt động như mong đợi.

typescript Copy
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from '../src/app.module';

describe('AppController (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  it('/users/1 (GET)', () => {
    return request(app.getHttpServer())
      .get('/users/1')
      .expect(200)
      .expect('User with ID 1');
  });

  afterAll(async () => {
    await app.close();
  });
});

6. Lời Khuyên Khi Implement Testing Trong Dự Án

  • Bắt đầu với unit tests cho các service cơ bản để kiểm tra logic.
  • Sử dụng mock dependencies để tách biệt các lớp và kiểm tra độc lập.
  • Khi bạn đã cảm thấy tự tin với các unit tests, mở rộng sang integration tests và tiến tới E2E tests.
  • Đảm bảo tích hợp các bài test vào quy trình CI/CD để duy trì chất lượng mã nguồn liên tục.

Hy vọng rằng bài viết này sẽ giúp bạn có cái nhìn rõ hơn về việc kiểm thử trong NestJS. Nếu bạn cần thêm thông tin, đừng ngần ngại chia sẻ những vấn đề mà bạn gặp phải trong quá trình phát triển ứng dụng! 😊


Các Tài Nguyên Liên Quan

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào