单元测试中处理模拟本体对象的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
相关产品推荐
相关产品推荐

