目次
はじめに
テストで使用するMongoDBをどうするか悩んだ結果、mongodb-memory-serverを利用することにした。
mongodb-memory-serverはNode.jsのテスト環境での使用を目的としたパッケージで、メモリ上に一時的なMongoDBサーバを立ち上げることができる。わざわざ外部でmongoDBを準備をしなくても簡単にセットアップできる上に、メモリ上で動作するため実行速度が速い、クリーンアップが簡単などのメリットがある。
https://github.com/nodkz/mongodb-memory-server
使い方
globaSetupでMongoDBを起動するようにしておく。
import { MongoMemoryServer } from 'mongodb-memory-server'
/**
* メモリ上で動くMongoDBを起動する
* テストの実行前に1度だけ実行される
*/
export async function setup() {
// transactionを使う場合は、MongoMemoryReplSetを使う必要がある
// const mongod = await MongoMemoryReplSet.create()
const mongod = await MongoMemoryServer.create()
const uri = mongod.getUri('db-name')
;(global as any).MONGO_SERVER = mongod
process.env.MONGO_URI = uri
}
teardownではmongoDBを停止する処理を行う。
teardownと言う関数名でexportするとvitestがテスト終了時に実行してくれる。
/**
* メモリ上で動いているMongoDBを停止する
* 全てのテストが終了した後に1度だけ実行される
*/
export async function teardown() {
await (global as any).MONGO_SERVER.stop()
}
vitest.config.tsでそれぞれのファイルをglobalSetupに設定しておく。
export default defineConfig({
test: {
...省略
globalSetup: ['tests/globalSetup.ts', 'tests/teardown.ts'],
mongoDBとの連携を関数化しておく。
ここではmongooseを使用してmongoDBとの接続を行っている。
import mongoose from 'mongoose'
/**
* DBに接続する
*/
export const dbConnect = async () => {
mongoose.set('strictQuery', true)
await mongoose.connect(process.env.MONGO_URI ?? '')
}
/**
* DBのデータを全てクリアする
*/
export const dbClear = async () => {
await mongoose.connection.db.dropDatabase()
}
/**
* DBとの接続を切断する
*/
export const dbDisconnect = async () => {
await mongoose.disconnect()
}
それぞれのテストから簡単に接続/切断できるようになった。
beforeAll(async () => {
await dbConnect()
// 後の処理
})
afterAll(async () => {
await dbClear()
await dbDisconnect()
})
コメント