Vitest测试Cloudflare Workers时如何读取文件数据并操作R2桶?
解决方案
1. 直接使用开发/测试R2桶进行测试
完全可以直接用开发环境的R2桶做测试,但建议专门创建一个测试用的R2桶(或给测试数据加统一前缀,比如test-),避免污染生产/开发数据。
实现步骤:
- 在Vitest配置文件(
vitest.config.ts)中指定测试环境为Cloudflare Workers,并注入R2绑定:
import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { environment: 'cloudflare-workers', environmentOptions: { bindings: { TEST_R2_BUCKET: { type: 'r2', name: '你的测试R2桶名称' } } } } });
- 在测试文件中直接操作绑定的桶:
import { describe, beforeEach, test } from 'vitest'; describe('Worker R2 交互测试', () => { const bucket = globalThis.TEST_R2_BUCKET; beforeEach(async () => { // 测试前清空测试前缀的文件(可选,避免数据残留) const objects = await bucket.list({ prefix: 'test-' }); await Promise.all(objects.objects.map(obj => bucket.delete(obj.key))); }); test('验证文件读取逻辑', async () => { // 上传测试数据 await bucket.put('test-sample.json', JSON.stringify({ id: 1, content: 'test' })); // 调用Worker逻辑并断言结果 }); });
如果需要连接真实的Cloudflare R2服务,可通过@cloudflare/r2-client创建客户端:
import { R2Client } from '@cloudflare/r2-client'; const r2Client = new R2Client({ accountId: '你的Cloudflare账号ID', accessKey: '你的R2访问密钥', secretKey: '你的R2密钥' }); const testBucket = r2Client.bucket('你的测试R2桶名称');
2. 解决JSON测试数据读取问题
Worker模拟环境不支持require或CommonJS语法,改用**ES模块规范的fetch+import.meta.url**读取本地JSON文件:
async function loadTestData() { const dataUrl = new URL('./test-compare-data.json', import.meta.url); const response = await fetch(dataUrl); return await response.json(); } // 在测试前置钩子中加载并上传数据 beforeEach(async () => { const testCompareData = await loadTestData(); await bucket.put('test-compare.json', JSON.stringify(testCompareData)); });
这种方式完全符合Worker运行环境规范,不会触发require()未实现的错误。
3. 用Wrangler本地模拟R2(可选)
如果不想连接真实R2桶,可使用Wrangler的本地模拟功能:
- 安装Wrangler:
npm install wrangler -D - 在
wrangler.toml中配置本地R2桶:
[[r2_buckets]] name = "TEST_R2_BUCKET" preview_bucket_name = "TEST_R2_BUCKET"
- 启动本地模拟服务:
wrangler dev --local - 测试时Vitest会自动连接本地模拟的R2桶,无需配置真实密钥,适合快速迭代测试。
内容的提问来源于stack exchange,提问作者decisionmachine
相关产品推荐
相关产品推荐

