ORMにPrismaを使用した時のJestでのテスト環境のセットアップ
Express + TypeScript + Prisma + MySQL + Jestで簡単なRESTful APIを作成する前提
叩き台のプロジェクトは以下の記事を参考にしました
関心の分離を意識してサーバーを作ってみる(TypeScript + Express)
sadnessOjisan/ts-clean
Prismaの公式サイトはこちら
マイグレーションがまだPreview段階ですが自分が少し触ってみた感じ良さげでした。
特に致命的なバグには遭遇しませんでした。
Experimentalの時から生成されるマイグレーションファイルが劇的に変わり、生のsqlファイルのみが生成されるようになって分かりやすくなったのでよかったです。
Prisma Jest
でググったらまずこのリポジトリがヒットした
けどこれはPostgresなのでちょっと違う(自分はMySQL)
スター数もそこそこあるし参考になることは間違いない。
DBへの接続のミドルウェアをpg
からmysql2
に書き換えるだけのはず・・・
テスト環境ではテスト用のDBでテストしたい(開発環境用のDBでテストを走らせるとテストコードで生成されるレコードがそのまま挿入されてしまう)のでdocker/mysql/initdb.d/testdb.sql
ファイルを作成して
CREATE DATABASE IF NOT EXISTS `micro_post_test`;
GRANT ALL ON `micro_post_test`.* TO 'ojisan'@'%';
こんな感じのsqlを書いてDocker起動時にmicro_post_test
という名前のテスト環境用のDBを作成してojisan
ユーザからもアクセスできるように権限を付与する
セットアップ時に実行するマイグレーションコマンドがExperimental時のコマンドのままなので
await exec(`${prismaBinary} migrate dev --preview-feature`);
に差し替える
async teardown() {
const connection = mysql.createConnection({
host: 'db',
user: 'root',
password: 'password',
database: 'micro_post_test',
port: 3306
});
connection.query(`DROP SCHEMA IF EXISTS "${this.schema}" CASCADE`);
connection.end()
}
接続を切った時にスキーマをドロップするコードで
sqlMessage: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASCADE' at line 1"
って出る。
参考にしてるリポジトリをクローンして実行しても発生しない。
MySQLだと書き方が違うのかな?
SQLの知識が皆無なので分からない
async teardown() {
const connection = mysql.createConnection({
host: 'db',
user: 'root',
password: 'password',
database: 'micro_post_test',
port: 3306
});
connection.query(`DROP DATABASE micro_post_test`);
connection.end()
}
これに書き換えてjest.config.js
でmaxWorkers: 1
を指定したらとりあえずテストは全て通るようになった。
けど絶対違う(これだとテストにめっちゃ時間がかかる)
そもそも今回ほとんど初めてJestを触ったのでJestのシステムがあまり分かっていない。