空手道数据类型在动态请求中更改

时间:2018-08-14 08:26:52

标签: request karate

我有一个带有嵌套数组的大型json请求。数组中的一个字段期望有一个数字。我想在运行时传递此值。我面临的问题是,我传递的值(xyz = 10)被转换为字符串。 该如何处理?

样本功能:

功能:动态json 背景:

* def req1 = 
"""
    {
      "system":
      {
        "appVersion": "xxx",
        "clientIP": "x.y.z.a",
        "isPayloadEncrypted": true,
        "encryptionKey": ""
      },
      "payload":
      {
        "selectedProducts": [
          {
           "prodCode": "abc",
            "paymentMode": "Y",
        "selectedOpt": null,
        "selectedESOpt": null,
        "selectedComponents": [
          {
            "compoCode": "abc",
            "premium": 0,
            'term': <xyz>,
            'premiumTerm': <xyz>,
            "sumAssured": 100000,
          },
          {
            "compoCode": "abc2",
            "premium": 0,
            'term': <xyz>,
            'premiumTerm': <xyz>,
            "sumAssured": 100000,
          },

        ]
      }
    ]

  }
}

“”“

场景:验证条件   *替换req1.xyz = 10   给定URL baseURL   和路径“ anyPath”   并要求req1   方法发布时   然后状态为200

以某种方式,当生成请求时,它具有:     “ term”:“ 10”,     “ premiumTerm”:“ 10”,

同时,应该     “期限”:10,     “ premiumTerm”:10,

日志错误:

[Fatal Error] :6:3: The element type "meta" must be terminated by the matching end-tag "</meta>".
16:44:43.449 [main] WARN  com.intuit.karate - xml parsing failed, response data type set to string: org.xml.sax.SAXParseException; lineNumber: 6;
 columnNumber: 3; The element type "meta" must be terminated by the matching end-tag "</meta>".
16:44:43.449 [main] ERROR com.intuit.karate - status code was: 500, expected: 200, response time: 220, url: https://sqs-pacs-poeonline-qa.ocpapps
-dev.pru.intranet.asia/api/compute, response: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>TypeError: Cannot read property &#39;transactionId&#39; of undefined<br> &nbsp; &nbsp;at app.use (/usr/app/src/app.js:23:42)<br> &nbsp; &nbs
p;at Layer.handle_error (/usr/app/src/node_modules/express/lib/router/layer.js:71:5)<br> &nbsp; &nbsp;at trim_prefix (/usr/app/src/node_modules/e
xpress/lib/router/index.js:315:13)<br> &nbsp; &nbsp;at /usr/app/src/node_modules/express/lib/router/index.js:284:7<br> &nbsp; &nbsp;at Function.p
rocess_params (/usr/app/src/node_modules/express/lib/router/index.js:335:12)<br> &nbsp; &nbsp;at next (/usr/app/src/node_modules/express/lib/rout
er/index.js:275:10)<br> &nbsp; &nbsp;at /usr/app/src/node_modules/express/lib/router/index.js:635:15<br> &nbsp; &nbsp;at next (/usr/app/src/node_
modules/express/lib/router/index.js:260:14)<br> &nbsp; &nbsp;at Layer.handle_error (/usr/app/src/node_modules/express/lib/router/layer.js:67:12)<
br> &nbsp; &nbsp;at trim_prefix (/usr/app/src/node_modules/express/lib/router/index.js:315:13)</pre>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

您确实应该更仔细地阅读文档。对于replace

  

由于replace将结果自动转换为字符串,因此请确保在适用的情况下将类型转换回JSON(或XML)

type conversion上有一整节内容。

但是无论如何,我认为最适合这种情况的解决方案是embedded-expressions

* def xyz = 10
* def req1 = 
"""
    {
      "system":
      {
        "appVersion": "xxx",
        "clientIP": "x.y.z.a",
        "isPayloadEncrypted": true,
        "encryptionKey": ""
      },
      "payload":
      {
        "selectedProducts": [
          {
           "prodCode": "abc",
            "paymentMode": "Y",
        "selectedOpt": null,
        "selectedESOpt": null,
        "selectedComponents": [
          {
            "compoCode": "abc",
            "premium": 0,
            'term': '#(xyz)',
            'premiumTerm': '#(xyz)',
            "sumAssured": 100000,
          },
          {
            "compoCode": "abc2",
            "premium": 0,
            'term': '#(xyz)',
            'premiumTerm': '#(xyz)',
            "sumAssured": 100000,
          },

        ]
      }
    ]

  }
}
"""