使用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')
    })
  })
})

这就是您需要做的所有事情。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/292651.html

(0)
上一篇 2022年11月6日
下一篇 2022年11月6日

相关推荐

发表回复

登录后才能评论