嵌入式表达式在复杂的json中没有被正确替换

时间:2018-05-16 10:25:20

标签: karate

在空手道测试中 - 我们能够在json中替换单个键的嵌入式表达式。但是当试图替换json的复杂键时它无法正常工作

输入json:

    {
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "#(integrationName)",
                "description": "#(tenantID)",
                "serviceData": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"start_block\" id=\"foOIiCF5aZGnie1GzBDB\" deletable=\"false\" x=\"150\" y=\"25\">\n    <field name=\"ORCH_NAME\">Add2NumDocInputs</field>\n    <field name=\"SVC_SIGNATURE\">{\"sig_in\":{\"rec_ref\":\"fld_[#(tenantID)]_stage00.documenttypes:sum2\",\"field_type\":\"recref\",\"node_type\":\"record\",\"field_dim\":\"0\"},\"sig_out\":{\"field_type\":\"record\",\"node_type\":\"record\",\"field_dim\":\"0\"}}</field>\n    <field name=\"AUDIT_SETTINGS\"></field>\n    <statement name=\"ADD_BLOCKS\">\n      <block type=\"service_block_math\" id=\"aUqb0MAozTHQFuHj5rma\">\n        <field name=\"SERVICE\">pub.math:addInts</field>\n        <field name=\"SERVICE_DESC_FIELD\"></field>\n        <field name=\"SERVICE_DETAILS\">{\"service\":\"pub.math:addInts\",\"map\":[{\"sourcePath\":\"/n2;1;0\",\"targetPath\":\"/num2;1;0\"},{\"sourcePath\":\"/n1;1;0\",\"targetPath\":\"/num1;1;0\"}]}</field>\n      </block>\n    </statement>\n  </block>\n</xml>"
            }
        }
    }
}

在上面的json中,'tenantID'是从测试用例传递的密钥。 'tenantID'被正确替换为json中的'description'键。但它没有被'serviceData'键替换

请提出一些解决方案。 提前致谢

1 个答案:

答案 0 :(得分:0)

编辑:在发布了很长的答案后(请参阅本答案的结尾/第二部分),我意识到使用空手道的replace语法有一个超级简单的解决方案:

* def integrationName = 'hello'
* def tenantID = 'world'
* def json =
"""
{
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "#(integrationName)",
                "description": "#(tenantID)",
                "serviceData": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"start_block\" id=\"foOIiCF5aZGnie1GzBDB\" deletable=\"false\" x=\"150\" y=\"25\">\n    <field name=\"ORCH_NAME\">Add2NumDocInputs</field>\n    <field name=\"SVC_SIGNATURE\">{\"sig_in\":{\"rec_ref\":\"fld_[<tenantID>]_stage00.documenttypes:sum2\",\"field_type\":\"recref\",\"node_type\":\"record\",\"field_dim\":\"0\"},\"sig_out\":{\"field_type\":\"record\",\"node_type\":\"record\",\"field_dim\":\"0\"}}</field>\n    <field name=\"AUDIT_SETTINGS\"></field>\n    <statement name=\"ADD_BLOCKS\">\n      <block type=\"service_block_math\" id=\"aUqb0MAozTHQFuHj5rma\">\n        <field name=\"SERVICE\">pub.math:addInts</field>\n        <field name=\"SERVICE_DESC_FIELD\"></field>\n        <field name=\"SERVICE_DETAILS\">{\"service\":\"pub.math:addInts\",\"map\":[{\"sourcePath\":\"/n2;1;0\",\"targetPath\":\"/num2;1;0\"},{\"sourcePath\":\"/n1;1;0\",\"targetPath\":\"/num1;1;0\"}]}</field>\n      </block>\n    </statement>\n  </block>\n</xml>"
            }
        }
    }
}
"""
* replace json.tenantID = tenantID
* match json == 
"""
{
    "integration": {
        "serviceData": {
            "integrationService": {
                "name": "hello",
                "description": "world",
                "serviceData": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"start_block\" id=\"foOIiCF5aZGnie1GzBDB\" deletable=\"false\" x=\"150\" y=\"25\">\n    <field name=\"ORCH_NAME\">Add2NumDocInputs</field>\n    <field name=\"SVC_SIGNATURE\">{\"sig_in\":{\"rec_ref\":\"fld_[world]_stage00.documenttypes:sum2\",\"field_type\":\"recref\",\"node_type\":\"record\",\"field_dim\":\"0\"},\"sig_out\":{\"field_type\":\"record\",\"node_type\":\"record\",\"field_dim\":\"0\"}}</field>\n    <field name=\"AUDIT_SETTINGS\"></field>\n    <statement name=\"ADD_BLOCKS\">\n      <block type=\"service_block_math\" id=\"aUqb0MAozTHQFuHj5rma\">\n        <field name=\"SERVICE\">pub.math:addInts</field>\n        <field name=\"SERVICE_DESC_FIELD\"></field>\n        <field name=\"SERVICE_DETAILS\">{\"service\":\"pub.math:addInts\",\"map\":[{\"sourcePath\":\"/n2;1;0\",\"targetPath\":\"/num2;1;0\"},{\"sourcePath\":\"/n1;1;0\",\"targetPath\":\"/num1;1;0\"}]}</field>\n      </block>\n    </statement>\n  </block>\n</xml>"
            }
        }
    }
}
"""

编辑:这是原始答案(下面),留在这里,因为它可能有用作参考。

哇,我可以说这是XML和JSON的可怕组合。嵌入式表达式有一个规则,它们必须是以<{1}}开始的字符串

所以你需要将你的流程分成这样的东西。由于你的有效载荷,它很复杂。不是因为空手道:)

#(

另请阅读有关类型转换的文档:https://github.com/intuit/karate#type-conversion