You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的取值:

  1. 前置依赖安装
    确保已安装相关开发依赖:
npm install mongodb-memory-server --save-dev
  1. 测试文件示例
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:35:37