为什么空手道功能在使用"类"创建JS对象时无法访问JS对象的方法?



karate-config.js中,当我使用'class'关键字创建JavaScript对象,然后将其实例添加到空手道配置时,功能无法访问对象的方法(只能访问构造函数的属性)。

为什么?

见下面一个可能的解决方案,但我更喜欢使用ES6的样式。

下列不是工作:

function fn() {

// define my object using 'class'
class My {
constructor(foo) {
this.foo = foo;
}

bar() {
return this.foo;
}
}

// instanciate it
var my = new My("x");

// test accessing the 'bar' method: works
karate.log(my.bar()); // prints "x"
// adding instance to karate config
var config = {
my: my
}

return config;
}

在一个特性中,如果我访问my.bar()方法,它失败了,因为它不知道一个名为'bar'的属性,如果我打印对象,它只返回构造函数的属性:

Feature: Access the 'bar' method
Scenario: Print it
* print my
* print my.bar()

输出:

13:52:28.530 [main]  DEBUG com.intuit.karate.Suite - [config] karate-config.js
13:52:29.309 [main]  INFO  com.intuit.karate - x
13:52:29.346 [main]  INFO  com.intuit.karate - [print] {
"foo": "x"
}
13:52:29.359 [main]  ERROR com.intuit.karate - features/my.feature:5
* print my.bar()
js failed:
>>>>
01: karate.log('[print]',my.bar())
<<<<
org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (bar) on {foo=x} failed due to: Unknown identifier: bar
- <js>.:program(Unnamed:1)
...

可能解决方法但我更喜欢使用ES6风格('class'关键字),因为我的对象有点复杂。

现在,如果我使用老式的(非ES6风格)方式没有'class'关键字,那么它工作:

function fn() {
// define my object the old fashioned way
function My(foo) {
this.foo = foo;
this.bar = () => this.foo;
}

// instanciate it
var my = new My("x");

// test accessing the 'bar' method: works
karate.log(my.bar()); // prints "x"
// adding instance to karate config
var config = {
my: my
}

return config;
}

输出:

13:57:57.286 [main]  DEBUG com.intuit.karate.Suite - [config] karate-config.js
13:57:58.041 [main]  INFO  com.intuit.karate - x
13:57:58.073 [main]  INFO  com.intuit.karate - [print] {
"foo": "x",
"bar": "com.intuit.karate.graal.JsValue$SharableMembersAndInstantiable@546621c4"
}
13:57:58.078 [main]  INFO  com.intuit.karate - [print] x
---------------------------------------------------------
feature: features/my.feature
scenarios:  1 | passed:  1 | failed:  0 | time: 0,0067
---------------------------------------------------------

Karate使用Graal JS引擎,它支持一些ES6语法。重点是逻辑的重用。我个人认为,在使用空手道时,应该尽可能少地使用JS。

也就是说,你是欢迎深入研究代码,弄清楚我们如何可能支持你所要求的,并提交一两个拉取请求。