ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

使用Prisma进行测试

2022-11-07 13:36:35  阅读:315  来源: 互联网

标签:prisma docker 数据库 Jest 测试 清理


模拟真实环境的一种方法是使用 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')
    })
  })
})

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

顺便说一下,我找到了几个用于此数据库清理的库,但没有一个完美运行。

标签:prisma,docker,数据库,Jest,测试,清理
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有