如何解析含动态键的JSON以实现对象模糊搜索测试?
动态键JSON的测试解析方案
问题描述
我有一段结构如下的JSON数据,其中accounts、deposites、cards下的对象名称是动态生成的(依赖客户端ID)。我需要实现类似“CFT - Piggy_Bank测试”的用例:当响应中存在至少一个entitySubSystems为CFT且entityType为PIGGY_BANK的账户时,测试通过。之前尝试用forEach方法未成功,想知道正确的解析方式,以及这种测试是否可行。
JSON数据示例:
{ "accounts": { "7-PIGGY_BANK-2739": { "timestamp": "2023-07-11T14:08:23.327", "state": "PRODUCT_ACTUAL", "entitySubSystems": "CFT", "number": "2739", "entityType": "PIGGY_BANK", "entityId": "2739", "entityLocalId": "2739" }, "17-CREDIT_CARD_ACCOUNT-1687": { "timestamp": "2023-07-11T14:08:22.81", "state": "PRODUCT_ACTUAL", "entitySubSystems": "OPENW", "number": "1687", "entityType": "CREDIT_CARD_ACCOUNT", "entityId": "1687", "entityLocalId": "1687" } }, "deposites": { "7-DEPOSIT-0495": { "timestamp": "2023-07-11T14:08:23.327", "state": "PRODUCT_ACTUAL", "entitySubSystems": "CFT", "number": "0495", "entityType": "DEPOSIT", "entityId": "4495", "entityLocalId": "20495" } }, "cards": { "17-DEBET_CARD-07820": { "timestamp": "2023-07-11T14:08:22.809", "state": "PRODUCT_ACTUAL", "entitySubSystems": "OPENW", "number": "07820", "entityType": "DEBET_CARD", "entityId": "40367", "entityLocalId": "07820" } } }
可行的解析与测试方案
这种测试完全可行,核心思路是跳过动态键,直接提取对象的值进行条件判断,推荐使用Object.values()配合some()方法,比forEach更适合这类存在性验证场景。
1. 单模块验证(仅检查accounts)
先提取accounts下的所有账户对象,再用some()判断是否存在符合条件的项:
// 假设response是你获取到的JSON数据 const targetExists = Object.values(response.accounts).some(account => { return account.entitySubSystems === 'CFT' && account.entityType === 'PIGGY_BANK'; }); // 测试断言示例(以Mocha+Chai为例) expect(targetExists).to.be.true;
2. 多模块全局验证(检查所有模块)
如果需要在accounts、deposites、cards中全局查找符合条件的实体,可以合并所有模块的值后再判断:
// 合并所有模块的实体对象为一个数组 const allEntities = [ ...Object.values(response.accounts), ...Object.values(response.deposites), ...Object.values(response.cards) ]; // 验证是否存在目标实体 const targetExists = allEntities.some(entity => { return entity.entitySubSystems === 'CFT' && entity.entityType === 'PIGGY_BANK'; }); // 测试断言 expect(targetExists).to.be.true;
为什么forEach没成功?
forEach只是遍历数组执行回调,没有返回值,无法直接告知是否找到符合条件的项。你需要额外设置一个外部变量来标记是否找到,而some()会在找到第一个符合条件的元素后立即停止遍历,直接返回布尔值,更简洁高效。
内容的提问来源于stack exchange,提问作者Igor Martakov
相关产品推荐
相关产品推荐

