【问题标题】:Karate check if xml request contains specific value空手道检查 xml 请求是否包含特定值
【发布时间】:2020-01-14 06:52:11
【问题描述】:

我的空手道模拟服务器将接受 XML 格式的请求,以下是请求示例:

<methodCall>
<methodName>MyMethod</methodName>
<params>
    <param>
        <value>
            <struct>
                <member>
                    <name>a</name>
                    <value>abc</value>
                </member>
                <member>
                    <name>b</name>
                    <value><i4>2</i4></value>
                </member>
            </struct>
        </value>
    </param>
</params>

&lt;struct&gt; 内,可能有多个&lt;member&gt; 标签。如何检查请求 &lt;member&gt; 中是否存在特定的 &lt;name&gt; 和特定的 &lt;value&gt;

我可以定义一个Scenario,如下所示:

Scenario: pathMatches('/test') && methodIs('post') && bodyPath('/methodCall/methodName') == 'MyMethod'

根据methodName 处理请求,但我想做不同的处理取决于它包含的&lt;member&gt;。例如:如果请求包含一个成员为&lt;name&gt;color&lt;/name&gt;,其值为&lt;value&gt;blue&lt;/value&gt;,那么我将相应地完成这项工作。

【问题讨论】:

    标签: karate


    【解决方案1】:

    也许你想多了,你所拥有的可能就足够了。您需要做的就是有条件地返回response。一个提示是,Karate 可以将 XML 自动转换为 JSON,这很方便,因为它更容易编写 JSON 路径查询或过滤操作:

    这里有一些示例代码可以给你一些想法:

    * def structs = get[0] request..member
    * def fun = function(x){ return x.name == 'a' && x.value == 'abc' }
    * def test = karate.filter(structs, fun)
    * if (test.length) karate.set('response', '<some>response</some>')
    

    我想重点是您正在尝试进行非平凡的条件处理,因此代码会比平时更复杂。

    您可以使用 JSON 路径而不是 karate.filter() hack,但查询表达式可能更难阅读 IMO。请注意,您可以在Background 中定义一个诸如getStructType() 之类的函数——将你想要的所有逻辑都放入其中——然后在Scenario HTTP 路径“路由”表达式中使用它。

    【讨论】:

      【解决方案2】:

      以下是空手道文档https://github.com/intuit/karate#xml中的一个小sn-p

      Given def cat = <cat><name>Billie</name><scores><score>2</score><score>5</score></scores></cat>
      # **sadly, xpath list indexes start from 1**
      Then match cat/cat/scores/score[2] == '5'
      # but karate allows you to traverse xml like json !!
      Then match cat.cat.scores.score[1] == 5
      

      您应该能够做这样的事情,注意您如何引用 xpath 的索引:

      Scenario: pathMatches('/test') && methodIs('post') && bodyPath('/methodCall/params/param/value/struct/member[1]/value') == 'abc'
      

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 1970-01-01
        • 2011-05-05
        • 2020-05-24
        • 2018-02-13
        • 1970-01-01
        相关资源
        最近更新 更多