如何在SST框架中Mock Config.Secret适配mongodb-memory-server测试
用MongoDB内存服务器Mock SST的Config.Secret及SST组件Mock方案
一、替换Config.Secret为MongoDB内存服务器地址
测试时可结合mongodb-memory-server启动临时内存数据库,再通过SST的Config.mock()方法覆盖MONGO_URI的取值:
- 前置依赖安装
确保已安装相关开发依赖:
npm install mongodb-memory-server --save-dev
- 测试文件示例
import { Config } from "@serverless-stack/node/config"; import { MongoMemoryServer } from "mongodb-memory-server"; import { MongoClient } from "mongodb"; import { beforeAll, afterAll } from "@jest/globals"; let mongoServer; // 测试前启动内存Mongo并Mock配置 beforeAll(async () => { mongoServer = await MongoMemoryServer.create(); const mongoUri = mongoServer.getUri(); // Mock Secret类型的MONGO_URI Config.mock({ MONGO_URI: mongoUri }); }); // 测试后关闭内存Mongo afterAll(async () => { await mongoServer.stop(); }); // 示例测试用例 test("验证内存Mongo连接", async () => { const client = new MongoClient(Config.MONGO_URI); await client.connect(); // 执行数据库操作测试 const db = client.db("test-db"); const collection = db.collection("test-collection"); await collection.insertOne({ name: "test" }); const doc = await collection.findOne({ name: "test" }); expect(doc).not.toBeNull(); await client.close(); });
二、Mock SST专属组件
针对SST的框架组件(如Api、Bucket、Queue等),可通过两种方式Mock:
方式1:直接Mock组件构造函数
用Jest的jest.mock()覆盖组件实现,模拟所需属性或方法:
import { Api, Bucket } from "@serverless-stack/resources"; import { StackContext } from "@serverless-stack/resources"; // Mock Api和Bucket组件 jest.mock("@serverless-stack/resources", () => { const originalModule = jest.requireActual("@serverless-stack/resources"); return { ...originalModule, Api: jest.fn().mockReturnValue({ url: "https://mock-api.example.com", addRoutes: jest.fn() }), Bucket: jest.fn().mockReturnValue({ bucketName: "mock-bucket", bucketArn: "arn:aws:s3:::mock-bucket" }) }; }); test("测试Api组件Mock", () => { const mockStack = { stack: {} } as StackContext; const api = new Api(mockStack.stack, "MyApi", { routes: {} }); expect(api.url).toBe("https://mock-api.example.com"); expect(Api).toHaveBeenCalled(); }); test("测试Bucket组件Mock", () => { const mockStack = { stack: {} } as StackContext; const bucket = new Bucket(mockStack.stack, "MyBucket"); expect(bucket.bucketName).toBe("mock-bucket"); expect(Bucket).toHaveBeenCalled(); });
方式2:使用SST Testing工具包模拟栈输出
若需模拟整个栈的输出值,可使用SST官方的@serverless-stack/testing工具:
import { Testing } from "@serverless-stack/testing"; import { beforeAll } from "@jest/globals"; beforeAll(async () => { // 初始化测试环境 await Testing.init(); }); test("模拟栈输出", async () => { // 定义模拟的栈输出值 const mockOutputs = { MY_API_URL: "https://mock-api.example.com", MY_BUCKET_NAME: "mock-bucket" }; // 覆盖指定栈的输出 Testing.mockStackOutputs("MyStack", mockOutputs); // 获取模拟的输出并验证 const outputs = await Testing.getStackOutputs("MyStack"); expect(outputs.MY_API_URL).toBe("https://mock-api.example.com"); });
内容的提问来源于stack exchange,提问作者Muaaz Rafi
相关产品推荐
相关产品推荐

