【问题标题】:Javascript code not working after upgrade to karate 0.9.3升级到空手道 0.9.3 后 Javascript 代码不起作用
【发布时间】:2019-06-13 12:40:30
【问题描述】:

功能文件中的以下功能适用于版本 0.9.2。升级到 0.9.3,这会产生错误:javascript function call failed: Index: 0.0, Size: 0。代码如下:

var cnd = ['test1','test2'];

function set_filter(arg)
{
     var i;
     var filter = {filterValues:[]};
     for(i=0;i<arg.length;i++)
     {
         filter.filterValues[i] = arg[i];
     }
     return filter;
}

set_filter(cnd)

我之前也可以使用下面的方法将值推送到 javascript 数组中,但这在 0.9.3 中也已停止工作。获取错误:javascript function call failed: TypeError: arr.push is not a function

var arr = [];
arr.push('test1','test2');

尝试以下在 0.9.2 中有效但在 0.9.3 中报告错误(如上所述)的场景

Scenario: JS test
    * def filter_template =
    """
    function() {
    var filter_params = {
        filterValues:[]
    };
    return filter_params;
    }
    """
    * def template = call filter_template
    * def filter_condition = ['test1','test2']
    * def setFilter =
    """
      function(arg) {
        var i;
        var filter = arg.filter_template;
        for(i=0;i<arg.condition.length;i++)
        {
          filter.filterValues[i] = arg.condition[i];
        }
        return filter;
      }
    """
    * def getFilter = call setFilter { filter_template: '#(template)', condition: '#(filter_condition)' }
    * print getFilter

非常感谢您的帮助。

【问题讨论】:

  • 你能不能把它变成一个可行的例子,我可以粘贴到一个新的Scenario: 并在本地尝试?了解您如何将此 JS 与功能文件混合对我来说很重要。或者请遵循以下流程:github.com/intuit/karate/wiki/How-to-Submit-an-Issue
  • @PeterThomas 我已经编辑了问题并添加了工作示例。

标签: karate


【解决方案1】:

我们已经使 JS 转换更加严格,一切都将是幕后的 Java 集合。如果您进行此更改,事情将开始工作:

filter.filterValues.set(i, arg.condition.get(i));

push() 也是如此 - 请改用 add()karate.appendTo(varname, value)

我强烈建议不要使用太多的 JS 逻辑尤其是循环。空手道有map()forEach()repeat()等功能来解决这些需求。请参考这里的文档:https://github.com/intuit/karate#loops

稍后您会感谢我,因为这将使您的脚本更易于理解和维护。需要这样做的一个原因是为我们将来更改 JS 引擎铺平道路。

【讨论】:

  • 感谢您的回复。以下内容对我有用:filter.filterValues.add(arg.condition.get(i)); 我将这个问题标记为已回答。但是,我很难在我的特定场景中使用 karate.map() 或其他内置方法。我将发布一个单独的问题。仅供参考 - 我的过滤器模板位于 .js 文件中。每个测试用例都指定了自己的过滤条件,我使用 java 脚本将该条件添加到过滤器模板中并执行特定的测试。不知道我将如何绕过 jaavscript 来实现这一点。
  • @rochitsen 我不是说零 JS,而是尽可能少地使用并且根本不使用循环。如果需要,请提出一个单独的问题,并请保持简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
相关资源
最近更新 更多