模拟真实环境的一种方法是使用 Docker 封装数据库和一些测试数据。这可以通过测试来启动和拆除,因此可以作为远离生产数据库的隔离环境运行。
本指南假设您的计算机上安装了 Docker 和 Docker Compose,并在项目中安装了 Jest 设置。
我明白你在说什么,但是...你想为测试准备那么多吗?我想更轻松、更灵活地运行测试。
这很重要,因为文档没有告诉我们如何为每个测试用例轻松清理数据库,这使得测试独立并根据测试的顺序更改其行为。
所以让我们去做吧。
在本例中,我们准备了以下架构。
datasource db { provider = "postgresql" url = env("DB_URL") } generator client { provider = "prisma-client-js" } model User { id Int @id @default(autoincrement()) email String @unique name String }
npx prisma generate
首先,我们可以使用 Dotenv 指定用于测试的数据库的 URL。
npm i -D dotenv
# .env.test DB_URL=postgresql://user:password@127.0.0.1:5432/example-test
接下来,我们将定义测试过程。在这里,让我们使用脚本的“pre”和“post”函数。
{ "scripts": { "pretest": "pg_ctl -D db/pgdata start && dotenv -e .env.test -- prisma migrate dev", "test": "dotenv -e .env.test -- mocha", "posttest": "pg_ctl -D db/pgdata stop" } }
这里的重点是使用Dotenv的API来使用。.env.test
我们需要做的最后一件事是清理数据库,这是我们申请的第一件事。在摩卡的情况下,这是通过 beforeEach、afterEach 完成的。
import { PrismaClient } from '@prisma/client' export class PrismaCleaner { constructor(prisma = new PrismaClient()) { this.prisma = prisma const propertyNames = Object.getOwnPropertyNames(prisma) this.modelNames = propertyNames.filter((name) => this.isModelName(name)) } async clean() { console.log(`Database cleaning...`) return Promise.all( this.modelNames.map((modelName) => this.prisma[modelName].deleteMany()) ) } /** * @param {String} name * @returns {Boolean} */ isModelName(name) { return !name.match(/^(_|\$)/) } }
import * as assert from 'assert' import { PrismaCleaner } from '../index.js' import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() const cleaner = new PrismaCleaner() describe('prisma-cleaner', () => { beforeEach(async () => { await cleaner.clean() # This }) afterEach(async () => { await cleaner.clean() # This }) describe('first creation', () => { it('creates a user', async () => { const user = await prisma.user.create({ data: { name: 'John Lenon', email: 'john@example.com' } }) assert.equal(user.name, 'John Lenon') }) }) describe('second creation', () => { it('creates a user', async () => { const user = await prisma.user.create({ data: { name: 'John Wick', email: 'john@example.com' } }) assert.equal(user.name, 'John Wick') }) }) })
这就是您需要做的所有事情。