使用 JavaScript 的`using`关键字进行洁净室测试

主要观点:using关键字引入到 TypeScript 5.2 中,可用于测试以干净地封装创建和销毁测试资源的过程,如测试数据库和模拟服务器,避免资源冲突等问题。
关键信息:

  • Explicit Resource Management proposal 被推进到阶段 3 并引入using关键字。
  • 测试中常见问题是一个测试会影响后续测试,需将测试副作用导向专用资源,如使用临时目录测试文件系统操作。
  • 用 Vitest 写测试,通过 globalSetup 脚本启动 PostgreSQL 容器,在测试中创建数据库克隆并避免冲突。
  • 创建帮助函数createDatabaseClient来创建数据库客户端,每次克隆使用随机生成的数据库名,返回 Drizzle 数据库客户端和[Symbol.asyncDispose]用于清理。
  • 测试代码中使用await using语法创建和销毁数据库,其可翻译为传统的try...finally结构,避免共享变量和测试步骤泄漏。
    重要细节:
  • vitest.config.ts中指定globalSetup./src/testing/setup-db.ts来启动数据库容器。
  • setup函数创建容器、应用迁移、存储连接信息并停止容器,teardown函数停止容器。
  • createDatabaseClient函数创建连接到容器的数据库客户端,使用随机数据库名避免冲突,返回客户端和清理函数。
  • 测试代码中使用await using创建数据库资源并进行操作,最终会自动清理。
  • 对比其他测试框架,如 Golang 的T.Cleanup和 Ava 的t.teardown,JavaScript 和 TypeScript 现在有描述资源生命周期的语法和运行时原语。
阅读 7
0 条评论