メインコンテンツまでスキップ

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' }]);
});
});

これで、テストの基本的な役割と使用方法について理解できました。次のセクションでは、デプロイメントの基本と使用方法について説明します。