繁体   English   中英

空手道:有没有办法从Examples变量中获取JSON对象键的长度?

[英]Karate: Is there a way of getting JSON object keys length from an Examples variable?

我有空手道测试通过:

  Scenario Outline: Find all the the prime factors in the range from <start> to <end> are <result>
    Given path '/primefactors'
    And param start = <start>
    And param end = <end>
    When method get
    Then status 200
    And match header content-type contains 'application/json'
    And match header content-type contains 'charset=utf-8'
    And match response == {numbers:<result>, start:<start>, end:<end>, count:<count>, type:PrimeFactors}
    Examples:
      | start | end | result                                       | count
      | 8     | 10  | {8: [2,2,2], 9:[3,3], 10:[2,5]}              | 3
      | 13    | 16  | {13: [13], 14:[2,7], 15:[3,5], 16:[2,2,2,2]} | 4

但是,我想要做的是没有来自Examples:部分的count变量,只是通过这种方式从结果对象变量中的键数的长度派生计数:

 Scenario Outline: Find all the the prime factors in the range from <start> to <end> are <result>
    Given path '/primefactors'
    And param start = <start>
    And param end = <end>
    When method get
    Then status 200
    And match header content-type contains 'application/json'
    And match header content-type contains 'charset=utf-8'
    And def result = <result>
    And match response == {numbers:<result>, start:<start>, end:<end>, count:'#(Object.keys(result).length)', type:PrimeFactors}
    Examples:
      | start | end | result                                        
      | 8     | 10  | {8: [2,2,2], 9:[3,3], 10:[2,5]}               
      | 13    | 16  | {13: [13], 14:[2,7], 15:[3,5], 16:[2,2,2,2]}  

当我尝试这个时,我收到一个错误:

primefactors.feature:33 - javascript evaluation failed: Object.keys(result).length, TypeError: {8=[2,2,2], 9=[3,3], 10=[2,5]} is not an Object in <eval> at line number 1

而且测试失败了。

鉴于Object.keys(result).length是有效的JS(使用Chrome开发控制台):

result = {8: [2,2,2], 9:[3,3], 10:[2,5]} 
{8: Array(3), 9: Array(2), 10: Array(2)}
Object.keys(result).length
3

我究竟做错了什么? 这样做的正确方法是什么?

更新(2019年4月9日)以下成功:

  Background:
    * url baseUrl
    * configure lowerCaseResponseHeaders = true
    * def keys = function(o){ return o.keySet() }
    * def values = function(o){ return o.values() }
    * def size = function(o){ return o.size() }

  Scenario Outline: Find all the the prime factors in the range from <start> to <end> are <result>
    Given path '/primefactors'
    And param start = <start>
    And param end = <end>
    When method get
    Then status 200
    And match header content-type contains 'application/json'
    And match header content-type contains 'charset=utf-8'
    And def result = <result>
    And match response == {numbers:<result>, start:<start>, end:<end>, count: '#(size(result))', type:PrimeFactors}
    Examples:
      | start | end | result
      | 8     | 10  | {8: [2,2,2], 9:[3,3], 10:[2,5]}
      | 13    | 16  | {13: [13], 14:[2,7], 15:[3,5], 16:[2,2,2,2]}

是的,空手道中的JS并不是你在野外看到的JS,当我们搬到Graal时,这可能会改变

同时请使用此技巧从JSON获取密钥,大小(和值):

Scenario: json behaves like a java map within functions
  * def payload = { a: 1, b: 2 }
  * def keys = function(o){ return o.keySet() }
  * def values = function(o){ return o.values() }
  * def size = function(o){ return o.size() }
  * json result = keys(payload)
  * match result == ['a', 'b']
  * json result = values(payload)
  * match result == [1, 2]
  * def length = size(payload)
  * match length == 2

您应该能够在嵌入式表达式中使用函数,例如: '#(keys(foo))'

将来我们计划添加一个karate.keysOf()karate.sizeOf() API来使这更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM