10. Tests
テストの重要性
テストは、アプリケーションの品質と信頼性を確保するために不可欠です。Nest.jsは、単体テストとE2E(End-to-End)テストの両方をサポートしています。このセクションでは、Nest.jsアプリケーションのテスト方法について説明します。
ユニットテスト
ユニットテストは、個々のコンポーネント(サービス、コントローラーなど)が正しく動作するかを検証します。Nest.jsは、デフォルトでJestテストフレームワークを使用します。
ユニットテストの設定
Nest CLIを使用して新しいサービスを作成 すると、デフォルトでユニットテストファイルが生成されます。
nest generate service cats
以下は、生成された cats.service.spec.ts
ファイルの基本的なユニットテストの例です:
import { Test, TestingModule } from '@nestjs/testing';
import { CatsService } from './cats.service';
describe('CatsService', () => {
let service: CatsService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [CatsService],
}).compile();
service = module.get<CatsService>(CatsService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
it('should create a cat', () => {
const cat = { name: 'Test Cat', age: 1, breed: 'Test Breed' };
expect(service.create(cat)).toEqual(cat);
});
});
コントローラーのユニットテスト
コントローラーのユニットテストも同様に作成できます。以下は、cats.controller.spec.ts
の基本的なユニットテストの例です:
import { Test, TestingModule } from '@nestjs/testing';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
describe('CatsController', () => {
let controller: CatsController;
let service: CatsService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [CatsController],
providers: [CatsService],
}).compile();
controller = module.get<CatsController>(CatsController);
service = module.get<CatsService>(CatsService);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
it('should return an array of cats', async () => {
const result = [{ name: 'Test Cat', age: 1, breed: 'Test Breed' }];
jest.spyOn(service, 'findAll').mockImplementation(() => result);
expect(await controller.findAll()).toBe(result);
});
});
E2Eテスト
E2Eテストは、アプリケーション全体の動作を検証します。Nest.jsは、Supertestライブラリを使用してE2Eテストをサポートしています。
E2Eテストの設定
以下は、E2Eテストの基本的な設定と例です:
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('/ (GET)', () => {
return request(app.getHttpServer())
.get('/')
.expect(200)
.expect('Hello World!');
});
afterAll(async () => {
await app.close();
});
});
E2Eテストの実行
E2Eテストを実行するには、以下のコマンドを使用します:
npm run test:e2e
モックの使用方法
テスト環境で依存関係をモックすることは、外部サービスやデータベースに依存しないテストを可能にします。以下は、サービスをモックする例です:
import { Test, TestingModule } from '@nestjs/testing';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
describe('CatsController', () => {
let controller: CatsController;
let service: CatsService;
beforeEach(async () => {
const mockCatsService = {
findAll: jest.fn(() => [{ name: 'Test Cat', age: 1, breed: 'Test Breed' }]),
};
const module: TestingModule = await Test.createTestingModule({
controllers: [CatsController],
providers: [{ provide: CatsService, useValue: mockCatsService }],
}).compile();
controller = module.get<CatsController>(CatsController);
service = module.get<CatsService>(CatsService);
});
it('should return an array of cats', async () => {
expect(await controller.findAll()).toEqual([{ name: 'Test Cat', age: 1, breed: 'Test Breed' }]);
});
});
これで、テストの基本的な役割と使用方法について理解できました。次のセクションでは、デプロイメントの基本と使用方法について説明します。