边缘函数

测试边缘函数

使用 Deno Test 为边缘函数编写单元测试


测试是开发过程中确保边缘函数正确性和性能的关键步骤。

Deno 中的测试

Deno 内置了一个测试运行器,可用于测试 JavaScript 或 TypeScript 代码。您可以阅读官方文档获取更多信息及可用测试函数的详细说明。

文件夹结构

我们建议在 supabase/functions/tests 目录中创建测试文件,使用与函数相同的名称并加上 -test.ts 后缀:

1
2
3
4
5
6
7
8
9
10
└── 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

示例脚本

以下脚本是一个很好的起点,用于测试您的边缘函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// 导入所需的库和模块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标准库导入各种测试函数,包括assertassertExistsassertEquals
  • 我们从@supabase/supabase-js库导入createClientSupabaseClient类来与Supabase客户端交互
  • 我们定义Supabase客户端所需的配置,包括Supabase URL、API密钥和认证选项
  • testClientCreation函数测试Supabase客户端实例的创建,并查询数据库获取表中的数据。它验证查询是否返回了数据
  • testHelloWorld函数通过使用Supabase客户端的functions.invoke方法调用"Hello-world"边缘函数进行测试。它检查响应消息是否匹配预期的问候语
  • 我们使用Deno.test函数运行测试,为每个测试用例提供描述性名称和对应的测试函数

本地运行边缘函数

要在本地测试和调试边缘函数,您可以使用 Supabase CLI。下面介绍如何使用 Supabase CLI 在本地运行边缘函数:

  1. 确保 Supabase 服务器正在运行,执行以下命令:

    1
    supabase start
  2. 在终端中使用以下命令在本地启动边缘函数服务:

    1
    supabase functions serve

    该命令会启动一个本地服务器来运行您的边缘函数,使您能够在开发环境中测试和调试它们。

  3. 创建环境变量文件:

    1
    2
    3
    4
    5
    6
    7
    8
    # 创建文件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
  4. 要运行测试,请在终端中使用以下命令:

    1
    deno test --allow-all supabase/functions/tests/function-one-test.ts

相关资源