测试边缘函数
使用 Deno Test 为边缘函数编写单元测试
测试是开发过程中确保边缘函数正确性和性能的关键步骤。
Deno 中的测试
Deno 内置了一个测试运行器,可用于测试 JavaScript 或 TypeScript 代码。您可以阅读官方文档获取更多信息及可用测试函数的详细说明。
文件夹结构
我们建议在 supabase/functions/tests
目录中创建测试文件,使用与函数相同的名称并加上 -test.ts
后缀:
12345678910└── supabase ├── functions │ ├── function-one │ │ └── index.ts │ └── function-two │ │ └── index.ts │ └── tests │ └── function-one-test.ts # function-one 的测试 │ └── function-two-test.ts # function-two 的测试 └── config.toml
示例脚本
以下脚本是一个很好的起点,用于测试您的边缘函数:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061// 导入所需的库和模块import { assert, assertEquals } from 'jsr:@std/assert@1'import { createClient, SupabaseClient } from 'jsr:@supabase/supabase-js@2'// 将.env文件加载到Deno.env中import 'jsr:@std/dotenv/load'// 设置Supabase客户端配置const supabaseUrl = Deno.env.get('SUPABASE_URL') ?? ''const supabaseKey = Deno.env.get('SUPABASE_ANON_KEY') ?? ''const options = { auth: { autoRefreshToken: false, persistSession: false, detectSessionInUrl: false, },}// 测试Supabase客户端的创建和功能const testClientCreation = async () => { var client: SupabaseClient = createClient(supabaseUrl, supabaseKey, options) // 验证是否提供了Supabase URL和密钥 if (!supabaseUrl) throw new Error('supabaseUrl是必需的。') if (!supabaseKey) throw new Error('supabaseKey是必需的。') // 测试对数据库的简单查询 const { data: table_data, error: table_error } = await client .from('my_table') .select('*') .limit(1) if (table_error) { throw new Error('无效的Supabase客户端: ' + table_error.message) } assert(table_data, '查询应返回数据。')}// 测试'hello-world'函数const testHelloWorld = async () => { var client: SupabaseClient = createClient(supabaseUrl, supabaseKey, options) // 调用带参数的'hello-world'函数 const { data: func_data, error: func_error } = await client.functions.invoke('hello-world', { body: { name: 'bar' }, }) // 检查函数调用是否出错 if (func_error) { throw new Error('无效的响应: ' + func_error.message) } // 记录函数的响应 console.log(JSON.stringify(func_data, null, 2)) // 断言函数返回了预期结果 assertEquals(func_data.message, 'Hello bar!')}// 注册并运行测试Deno.test('客户端创建测试', testClientCreation)Deno.test('Hello-world函数测试', testHelloWorld)
这个测试用例包含两部分。第一部分测试客户端库,验证是否可以连接到数据库并从表(my_table
)返回值。第二部分测试边缘函数,检查接收到的值是否符合预期。以下是代码的简要概述:
- 我们从Deno标准库导入各种测试函数,包括
assert
、assertExists
和assertEquals
- 我们从
@supabase/supabase-js
库导入createClient
和SupabaseClient
类来与Supabase客户端交互 - 我们定义Supabase客户端所需的配置,包括Supabase URL、API密钥和认证选项
testClientCreation
函数测试Supabase客户端实例的创建,并查询数据库获取表中的数据。它验证查询是否返回了数据testHelloWorld
函数通过使用Supabase客户端的functions.invoke
方法调用"Hello-world"边缘函数进行测试。它检查响应消息是否匹配预期的问候语- 我们使用
Deno.test
函数运行测试,为每个测试用例提供描述性名称和对应的测试函数
请确保将占位符(supabaseUrl
、supabaseKey
、my_table
)替换为与您的Supabase设置相关的实际值。
本地运行边缘函数
要在本地测试和调试边缘函数,您可以使用 Supabase CLI。下面介绍如何使用 Supabase CLI 在本地运行边缘函数:
-
确保 Supabase 服务器正在运行,执行以下命令:
1supabase start -
在终端中使用以下命令在本地启动边缘函数服务:
1supabase functions serve该命令会启动一个本地服务器来运行您的边缘函数,使您能够在开发环境中测试和调试它们。
-
创建环境变量文件:
12345678# 创建文件touch .env# 添加 SUPABASE_URL 密钥echo "SUPABASE_URL=http://localhost:54321" >> .env# 添加 SUPABASE_ANON_KEY 密钥echo "SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0" >> .env# 或者您可以在编辑器中打开它:open .env -
要运行测试,请在终端中使用以下命令:
1deno test --allow-all supabase/functions/tests/function-one-test.ts
相关资源
- 完整指南:使用 Deno 测试 Supabase 边缘函数(Mansueli's tips)