使用Prisma进行测试
作者:互联网
模拟真实环境的一种方法是使用 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')
})
})
})
这就是您需要做的所有事情。