Closed6

ORMにPrismaを使用した時のJestでのテスト環境のセットアップ

KatsukiniwaKatsukiniwa

Express + TypeScript + Prisma + MySQL + Jestで簡単なRESTful APIを作成する前提
叩き台のプロジェクトは以下の記事を参考にしました

関心の分離を意識してサーバーを作ってみる(TypeScript + Express)
sadnessOjisan/ts-clean

Prismaの公式サイトはこちら

Prisma

マイグレーションがまだPreview段階ですが自分が少し触ってみた感じ良さげでした。

特に致命的なバグには遭遇しませんでした。

Experimentalの時から生成されるマイグレーションファイルが劇的に変わり、生のsqlファイルのみが生成されるようになって分かりやすくなったのでよかったです。

KatsukiniwaKatsukiniwa

Prisma Jestでググったらまずこのリポジトリがヒットした

ctrlplusb/prisma-pg-jest

けどこれはPostgresなのでちょっと違う(自分はMySQL)

スター数もそこそこあるし参考になることは間違いない。

DBへの接続のミドルウェアをpgからmysql2に書き換えるだけのはず・・・

KatsukiniwaKatsukiniwa

テスト環境ではテスト用の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 ユーザからもアクセスできるように権限を付与する

KatsukiniwaKatsukiniwa
  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の知識が皆無なので分からない

KatsukiniwaKatsukiniwa
  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.jsmaxWorkers: 1を指定したらとりあえずテストは全て通るようになった。
けど絶対違う(これだとテストにめっちゃ時間がかかる)

Jestテストの並行実行と逐次実行をちゃんと理解する

そもそも今回ほとんど初めてJestを触ったのでJestのシステムがあまり分かっていない。

このスクラップは2021/02/09にクローズされました