Karate框架能否使用Object.assign?及正确使用方法咨询
问题
我希望在Karate中使用Object.assign()函数,尝试直接调用或封装在函数中使用均失败。具体代码如下:
* def fn = function(target, source) {return Object.assign(target, source)} * def result = fn(clonePagePayload, sourcePayload) * print result
执行时出现如下错误:
* def result = fn(clonePagePayload, sourcePayload) js failed: >>>> 01: fn(clonePagePayload, sourcePayload) <<<< org.graalvm.polyglot.PolyglotException: com.oracle.truffle.api.dsl.UnsupportedSpecializationException: Unexpected values provided for ExportValueNodeGen@1e721583: [111, JSUndefined, false], [String,Nullish,Boolean]
现咨询:Karate是否支持Object.assign?以及如何正确使用该函数?
回答
- Karate本身支持
Object.assign(),但直接传递Karate内置的JSON变量时,可能因类型适配问题触发报错——因为Karate的JSON对象和标准JS对象存在底层差异。 - 两种正确使用方式:
- 将Karate变量转为标准JS对象后再调用
Object.assign():* def mergeObjects = function(target, source) { const jsTarget = JSON.parse(JSON.stringify(target)); const jsSource = JSON.parse(JSON.stringify(source)); return Object.assign(jsTarget, jsSource); } * def result = mergeObjects(clonePagePayload, sourcePayload) * print result - 优先使用Karate内置的
merge关键字,这是更贴合Karate语法的对象合并方案,无需依赖JS:* def result = merge clonePagePayload sourcePayload * print result
- 将Karate变量转为标准JS对象后再调用
- 注意:
merge会直接修改第一个参数对应的对象,如果需要保留原对象,先克隆再合并:* def clonedPayload = clone clonePagePayload * def result = merge clonedPayload sourcePayload
内容的提问来源于stack exchange,提问作者Mino Chen
相关产品推荐
相关产品推荐

