*.controller.spec.ts
や*.e2e-spec.ts
でテストを行う際に、あえてサービスに対してモックを行わず、Prismaを通してローカルに置いてあるSQLiteを使用するようにしていた。
ところが、テストの数が多くなってくるとConnectorError
が発生し始めた。
Invalid `this.prisma.user.delete()` invocation in ... 53 async remove(where: Prisma.UserWhereUniqueInput): Promise<User> { → 54 const deletedUser = await this.prisma.user.delete( Error occurred during query execution: ConnectorError(ConnectorError { user_facing_error: None, kind: ConnectionError(Timed out during query execution.) })
DATABASE_URL
環境変数を設定する際にbusy_timeout
パラメーターやconnection_limit
パラメーターを使用してみたがうまくいかなかった。
DATABASE_URL="file:./dev.db?busy_timeout=100000&connection_limit=1&socket_timeout=100000"
なので、DockerでMySQLコンテナを立ち上げてそれに接続するようにした。
僕の環境はM1 Proなので通常のmysql:8.0
イメージを使わず、arcm64v8/mysql:8.0-oracle
イメージを利用している。
// docker-compose.yml version: "3.7" services: mysql: image: arm64v8/mysql:8.0-oracle restart: always environment: MYSQL_ROOT_HOST: "%" MYSQL_ROOT_PASSWORD: "root" MYSQL_DATABASE: "example-database" MYSQL_USER: "mysql" MYSQL_PASSWORD: "mysql" ports: - "3306:3306" volumes: - ./mysql-data:/var/lib/mysql
docker-compose up -d
を実行して、コンテナを立ち上げる。そして、環境変数DATABASE_URL
を設定する。
DATABASE_URL="mysql://root:root@localhost:3321/example-database"
schema.prismaでprovider
をsqlite
に設定している場合はmysql
に変更する。
generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") }
あとはnpx prisma db push
を実行して完了。
環境を整えてすべてのテストを実行してみると、warn(prisma-client) There are already 10 instances of Prisma Client actively running.
は表示されたものの、テストは無事成功した。