NESTJSとMongoDBによる統合テストセットアップ
私のブログに投稿されたhttps://blog.merckx.fr/integration-testing-setup-with-nestjs-and-mongodb/
自動化されたテストは、ソフトウェアを作成するときに膨大な値を提供します.テスト駆動の開発アプローチに従うことができます:あなたのテストを書くことができますし、APIとその要件を前に設計し、テストを渡すためにコードを記述します.
よくある質問があります.
私はNESTJSを使用してプロジェクトの90 %を使用します.それらのプロジェクトの90 %で、私はMongoDBをデータベースとして使います.モジュールのための統合テストを書くテストは、テストされたモジュールの周りのすべての機能性を模擬することなく、単位テストを書くのと同じくらい簡単でなければなりません.したがって、我々は統合テストを実行するときに実際のMongoデータベースを統合する方法を見つける必要があります.これは次の行で提示されることです.
自分を好意的にし、フレンドリーな開発環境を作る
Dockerを使って開発環境を設定します.あなたはDockerと友人でないかもしれません、しかし、あなたはよりよくなります.Dockerは以下を有効にする友人です.
アプリケーションをコンテナ化する
この時点で、あなたのマシン上でDockerを実行し、データベースとしてMongoを使用してNESTJSプロジェクトがあります.私たちは使用するつもりですDocker Compose 異なるサービスを実行するいくつかのコンテナを作成します.下記
docker-compose.yml
file 2つのサービスを持つ環境を記述します.api
and mongo
. mongo
MongoDBサーバを実行するコンテナを作成しますapi
ポートを公開するNodeJS 14を実行するコンテナです3333
and 9229
. この方法では、ネストアプリケーションとデバッガに到達できます.version: "3.9"
services:
api:
image: node:14
volumes:
- .:/app
ports:
- 3333:3333
- 9229:9229
depends_on:
- mongo
environment:
NODE_ENV: development
mongo:
image: mongo:4.4.8
volumes:
- ./.docker/mongodb/data/db/:/data/db/
- ./.docker/mongodb/data/log/:/var/log/mongodb/
あなたはほとんど完全に設定されます.いくつかの役に立つワークフローを説明しましょう.必要なものを起動します
コンテナを設定しました.それは私たちのNESTJSアプリケーションを起動し、テストする時間です.次のコマンドを保存します
package.json
または、あなたの倉庫のシェルスクリプトとして:docker-compose run --service-ports -w /app api bash
これでサービスが開始されますapi
and mongo
とbashシェルを起動します.このシェルでは、NPMとノードを使用すると、あなたがDockerなしでそれをするのと同じ方法です!通常のコマンドを試してくださいnpm install
and npm start
and npm test
私は通常、私のこのコマンドを保存しますpackage.json
の下にstart:env
スクリプト{
...
"scripts": {
"start:env": "docker-compose run -w /app api bash",
...
}
}
テストを一度実行する
CIでテストを実行する場合は、次のコマンドを使用します.
docker-compose run -w /app api npm run test
ここでtest
スクリプトはインスタンスです:npm install && jest
書き込み積分テスト
あなたがNestjsアプリケーションを持っていると想像してください
PostModule
それはコントローラを持っているPostController
これには2つのAPIエンドポイントがあります.GET /post
: データベースに格納されているすべてのポストを返すPOST /post
: 新しいポストを作成し、データベースに格納しますPostService
あれPostController
インスタンスを使用します.サービスはデータベースにアクセスします.モジュールをテストするには、PostService
とPostController
. コントローラは直接データベースにアクセスしませんし、それを行うためのサービスが必要です.コントローラのテストを書くときは、次の選択肢があります.import { getConnectionToken, MongooseModule } from '@nestjs/mongoose';
import { NestExpressApplication } from '@nestjs/platform-express';
import { Test } from '@nestjs/testing';
import { Connection } from 'mongoose';
import * as supertest from 'supertest';
import { IPost } from '../model/post';
import { PostModule } from '../post.module';
describe('PostController', () => {
let app: NestExpressApplication;
const apiClient = () => {
return supertest(app.getHttpServer());
};
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
imports: [
MongooseModule.forRoot('mongodb://mongo:27017', { dbName: 'test' }), // we use Mongoose here, but you can also use TypeORM
PostModule,
],
}).compile();
app = moduleRef.createNestApplication<NestExpressApplication>();
await app.listen(3333);
});
afterEach(async () => {
await (app.get(getConnectionToken()) as Connection).db.dropDatabase();
await app.close();
});
it('creates a post', async () => {
await apiClient()
.post('/post')
.send({
content:
'I am all setup with Nestjs and Mongo for more integration testing. TDD rocks!',
})
.expect(201);
const posts: IPost[] = (await apiClient().get('/post')).body;
expect(posts[0].content).toBe(
'I am all setup with Nestjs and Mongo for more integration testing. TDD rocks!',
);
expect(posts[0].likes.length).toBe(0);
});
});
いくつかのメモPostModule
beforeEach
and afterEach
我々のフックは、データベースを作成して、削除します.使用するデータベース名をマングースに指定し、データベースを削除します(app.get(getConnectionToken()) as Connection).db.dropDatabase()
supertest
APIの消費者を作成するにはPostModule
アプリに注:で説明したセットアップの例を見つけることができますhttps://github.com/kevinmerckx/nesjts-with-mongo .
km
写真でGlen Carrie on Unsplash
資源
Reference
この問題について(NESTJSとMongoDBによる統合テストセットアップ), 我々は、より多くの情報をここで見つけました https://dev.to/kevinmerckx_47/integration-testing-setup-with-nestjs-and-mongodb-43mpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol