Karate DSL调用自定义JS文件函数运行报错该如何解决?
问题根因
- 语法兼容问题:Karate底层使用GraalJS执行JS代码,不支持Node.js的CommonJS规范,你代码中的
require('crypto-js')导入第三方包、module.exports = Encriptar;导出代码的写法都不符合Karate的JS运行要求。而且Karate读取外部JS文件时会自动将代码包裹成立即执行函数,你写的module.exports会被放到包裹函数的语法结构中间,直接触发语法报错,和你给出的错误日志完全匹配。 - 调用逻辑错误:你在feature文件中用
call关键字读取JS文件、后续用jsFunction.Encriptar()调用方法的写法不符合Karate的API规则。
修复方案
方案一:调整自定义JS写法(使用CryptoJS)
修改utils.js
首先删除require和module.exports相关代码,将CryptoJS的完整纯JS版本源码直接内嵌到utils.js开头,最终代码如下:
// 此处粘贴CryptoJS完整开源源码 function Encriptar(text, key) { var encoded = CryptoJS.AES.encrypt(text, key).toString(); return encoded; } // 单函数场景直接返回函数即可,多函数场景可返回对象批量暴露方法 return Encriptar;
修改test.feature
调整调用语法,不需要加call关键字,直接读取后调用即可:
Feature: test javascript Scenario: test javascript * def encriptar = read('utils.js') * def result = encriptar("text","key") * print result
方案二:直接使用Karate内置加密能力(更简单,无需引入第三方包)
Karate已经内置了AES加密的工具方法,不需要额外引入CryptoJS,直接修改test.feature即可实现需求:
Feature: test javascript Scenario: test javascript // 参数依次为待加密文本、加密密钥、加密算法(AES为默认值可省略) * def result = karate.encrypt('text', 'key', 'AES') * print result
内容的提问来源于stack exchange,提问作者jorgeleon79
相关产品推荐
相关产品推荐

