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

单元测试中处理模拟本体对象的decimal字段问题

解决Foundry单元测试中模拟Decimal字段的问题

方案1:用BigInt模拟Decimal值并手动做类型转换

Foundry对Decimal字段的限制源于JSON与Java转换的精度问题,但单元测试场景下可以绕过这个限制:

  • 创建模拟对象时,把Decimal值转成BigInt存储(比如123.45转成12345,对应两位小数精度,根据实际业务的小数位数调整)
  • 在测试逻辑或者被测函数的依赖适配层,再把BigInt转回需要的Decimal格式
  • 示例代码:
// 模拟对象时用BigInt存储decimal字段值
const mockObject = Objects.create("yourOntologyObjectType", {
  id: "test-id",
  decimalField: BigInt(12345) // 对应业务中的123.45
});

// 在测试逻辑中转换回Decimal格式
const actualDecimalValue = Number(mockObject.decimalField) / 100;

方案2:用测试框架MockObjects.create()的默认行为

如果用Jest这类测试框架,可以直接改写Objects.create()的实现,自定义它对Decimal字段的处理:

  • 覆盖默认方法,允许Decimal类型输入,内部用字符串或BigInt做兼容存储
  • 示例代码:
jest.mock("@foundry/functions-api", () => ({
  ...jest.requireActual("@foundry/functions-api"),
  Objects: {
    ...jest.requireActual("@foundry/functions-api").Objects,
    create: (objectType: string, properties: Record<string, any>) => {
      const processedProps = { ...properties };
      // 针对decimal字段做特殊处理,去掉小数点转成BigInt
      if (processedProps.decimalField !== undefined) {
        processedProps.decimalField = BigInt(processedProps.decimalField.toString().replace(".", ""));
      }
      return jest.requireActual("@foundry/functions-api").Objects.create(objectType, processedProps);
    }
  }
}));

方案3:临时切换到Object Storage V1兼容模式(项目允许的话)

虽然官方文档说明Decimal不支持Object Storage V2,但单元测试环境可以临时切换到V1模式:

  • 在测试配置中指定使用Object Storage V1,绕过V2的序列化限制
  • 注意:此方法仅用于单元测试,绝对不要在生产环境启用

内容的提问来源于stack exchange,提问作者MGDataAndSoftwareEngineering

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:12:40