追記あり
結論だけ知りたい方は一番最後までスクロールしてください
モチベーション
以前こちらの記事に書いた通り、Redwood.jsでは、テストの実行前に毎回Prisma Clientの生成とDBのリセットを行う処理が入ります。
これにより、私の環境ではテスト開始が毎回7秒程度遅延していました。
テスト駆動開発(TDD)などを行う場合はかなりスピードを遅らせる要因になるため、こちらを解消する方法をご紹介します。
TR;DR
SKIP_DB_PUSH=1 yarn rw test # 実行時にSKIP_DB_PUSH=1を設定します
説明
Redwood.jsのJestの設定はかなり、複雑に入り組んでいるのですが、Prisma Clientの生成とDBのリセットを行う処理についてはこちらに記述されています。
内容は以下のようになっています。
...
module.exports = async function () {
if (process.env.SKIP_DB_PUSH !== '1') {
const process = require('process')
// Load dotenvs
require('dotenv-defaults/config')
const cacheDirDb = `file:${path.join(__dirname, '.redwood', 'test.db')}`
process.env.DATABASE_URL = process.env.TEST_DATABASE_URL || cacheDirDb
const command =
process.env.TEST_DATABASE_STRATEGY === 'reset'
? ['prisma', 'migrate', 'reset', '--force', '--skip-seed']
: ['prisma', 'db', 'push', '--force-reset', '--accept-data-loss']
const execa = require('execa')
execa.sync(`yarn rw`, command, {
cwd: rwjsPaths.api.base,
stdio: 'inherit',
shell: true,
env: {
DATABASE_URL: process.env.DATABASE_URL,
},
})
}
}
冒頭で
if (process.env.SKIP_DB_PUSH !== '1') {
となっているのでこのSKIP_DB_PUSHの値が1になっていればこの関数は全てスキップされるようになっています。
実際にこちらのレポジトリで試してみましたが、
https://github.com/macoto1995/redwood-tdd
一度通常のyarn rw test
を実行した後SKIP_DB_PUSH=1 yarn rw test
を実行すると
Prisma Clientの生成とDBのリセットを行う処理を行わず、最初からJestが実行されました。
追記
db-pushオプションなるものがあるらしくこちらをfalseに設定するだけで同じことができるようです。
yarn rw test db-push false
本家のドキュメントにも記載されていました。
https://redwoodjs.com/docs/cli-commands#test
Redwood.jsの実装
https://github.com/redwoodjs/redwood/blob/main/packages/cli/src/commands/testHandler.js#L134