統合テストやユニットテストをするときに、外的要素であるデータベースから分離したいですよね。
弊プロダクトでは、NestJSにPrismaを導入しているので、PrismaのMock機能を使ってDBのモックを作って結合テストをしてみようと思います。
基本的には公式ドキュメントを参考にしています。
依存関係のインストール
yarn add -D jest-mock-extended
npmをご利用の際は置き換えてください
また、dockerをインストールしておいてください
必要なファイルの作成
docker-compose.yml
を作成します。
docker-compose.yml
# Set the version of docker compose to use
version: '3.9'
# The containers that compose the project
services:
db:
image: postgres:13
restart: always
container_name: integration-tests-prisma
ports:
- '5433:5432'
environment:
POSTGRES_USER: prisma
POSTGRES_PASSWORD: prisma
POSTGRES_DB: tests
.env.test
を作成します。
.env.test
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/tests"
[動作確認]DBコンテナイメージの実行
DBのコンテナを立ち上げます
docker-compose up -d
コンテナが立ち上がったことを確認します。
docker ps
結果
ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ad53ea38369 postgres:13 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:5433->5432/tcp integration-tests-prisma
PestgrSQLにログインできたことを確認します。
docker exec -it 6ad53ea38369 psql -U prisma tests
結果
tests-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+------------+------------+-------------------
postgres | prisma | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | prisma | UTF8 | en_US.utf8 | en_US.utf8 | =c/prisma +
| | | | | prisma=CTc/prisma
template1 | prisma | UTF8 | en_US.utf8 | en_US.utf8 | =c/prisma +
| | | | | prisma=CTc/prisma
tests | prisma | UTF8 | en_US.utf8 | en_US.utf8 |
(4 rows)
tests-#
package.json
にスクリプトを追加する
テストを実行するためのスクリプトを追加します。
上記で作成したDBコンテナに接続したいので、dotenv
で上記で作成した.env.test
を参照します
package.json
// ~~
"scripts": {
"docker:up": "docker-compose up -d",
"docker:down": "docker-compose down",
"test": "yarn docker:up && dotenv -e .env.test yarn prisma migrate deploy && jest -i"
},
// ~~
テストを実行する
yarn test
SeedあとはSeedを追加したりしてテストコードを存分に書けます。
PrismaのSeedの作り方はこちら。これから試します。