【问题标题】:Karate array field become object when it is returned from JS function空手道数组字段从 JS 函数返回时成为对象
【发布时间】:2019-01-18 15:01:25
【问题描述】:

我正在尝试将响应与 JS 函数生成的预定义 JSON(预期)进行比较。
JS:

    function(fleetId) {
        var result = {};
        result.name = "TestConnection";
        result.fleetId = fleetId;
        result.connectionConfigDefault = { "configParameters": [{ "keyName": "N/A", "value": "testValue" }], "id": 4 }
        return result;
    }

测试:

...
Then match connection.response ==
                                       """
                                           {
                                            connectionConfigDefault: '#(connectionJson.connectionConfigDefault)',
                                            fleetId: '#(connectionJson.fleetId)',
                                            id: '#number',
                                            name: '#(connectionJson.name)'
                                           }
                                       """

JS 返回:

"connectionConfigDefault": {
    "configParameters": { "0": { "keyName": "N/A", "value": "testValue" } }
    }

而不是预期:

"connectionConfigDefault": { 
"configParameters": [{ "keyName": "N/A", "value": "testValue" }]
}

附:我读过类似的question,但答案并没有帮助我解决问题。

【问题讨论】:

    标签: arrays object karate


    【解决方案1】:

    是的,JDK 中有一个奇怪的错误,除非您开始在 JS 中执行嵌套数组,否则您通常不会遇到这个错误:https://github.com/intuit/karate/blob/master/karate-junit4/src/test/java/com/intuit/karate/junit4/demos/js-arrays.feature#L44

    这里的解决方法是使用空手道而不是 JS 进行 JSON 构造:

    编辑:请参阅下面使用read(),而不是“内联”:

    # * def conf = { "configParameters": [{ "keyName": "N/A", "value": "testValue" }], "id": 4 }
    * def fun = 
    """
    function(fleetId) {
        var result = {};
        result.name = "TestConnection";
        result.fleetId = fleetId;
        var conf = read('conf.json');
        result.connectionConfigDefault = conf;
        return result;
    }
    """
    

    既然空手道有这么多好方法,你为什么不使用这些:

    * def fleetId = 1
    
    * set temp
    | path    | value            |
    | name    | 'TestConnection' |
    | fleetId | fleetId          |
    | connectionConfigDefault | { "configParameters": [{ "keyName": "N/A", "value": "testValue" }], "id": 4 } |
    
    * print temp
    

    【讨论】:

    • 谢谢@PeterThomas。我使用 JS 创建实体的 JSON(只有必需的参数)并在许多情况下重用它:创建简单或自定义实体。因此我需要将它保存在一个单独的文件中。
    • @RomanL。请注意,如果您通过 read() 加载 json 也可以正常工作
    • 我知道,但我需要构建(传递fleetId,生成唯一名称)JSON,而不仅仅是从文件中读取。
    • @RomanL。放松。查看我的编辑,只需在 JS sn-p 中使用 read() even 即可解决问题:)
    • 添加一种空手道方式从 JavaScript 函数 return Java.type("com.intuit.karate.JsonUtils").toJson(result) 返回以避免此问题
    【解决方案2】:

    你可以做一件事.. 在 javascript 中返回您的 json 之前,使用 configParameters = JSON.stringify(configParameters) 将其转换为字符串 现在从特征文件中调用这个函数,使用 json 变量。

    In function "function(fleetId)"
    

    在返回结果之前通过键入将其转换为字符串

    result = JSON.stringify(result)
    

    在这里,您将从空手道调用该函数

    * json fleetId = function(fleetId)
    * print fleetId
    

    希望这能解决你的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-13
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2020-07-20
      • 2017-08-02
      相关资源
      最近更新 更多