如何使用if条件检查附加值(使用空手道框架)?

如何使用if条件检查附加值(使用空手道框架)?

问题描述:

我想通过json模式检查GET/birds请求的响应。在我的功能:如何使用if条件检查附加值(使用空手道框架)?

* def abs = read (birds.json) 
* match response == abs.birdsSchema 

我需要把架构在json文件中,而不是在功能。 我必须根据性别检查其他值。例如:如果性别是男性,那么检查颜色是蓝色还是尾巴长或短。如果性别是女性,那么检查“唱歌”是真是假,鸡蛋数量。

所以我把在birds.json:

"birdsSchema":{ 
    "id": "#string", 
    "owner": "#number", 
    "town": "#? _ == 'New York' || _ == 'Washington'", 
    "type": "object", 
    "oneOf": [ 
     { 
      "properties": { 
       "gender": {"enum": ["male"]}, 
       "color":"blue", 
       "tail": "#? _ == 'long' || _ == 'short'" 
      } 
     }, 
     { 
      "properties": { 
       "gender": {"enum": ["female"]}, 
       "sings" : "#? _ == true || _ == false" 
       "eggs": "##number" 
      } 
     } 
    ] 
} 

但它不工作。错误:com.intuit.karate.exception.KarateException:path:$ [0] .type,actual:'female',expected:'object',reason:not equal。 如何在我的json文件中做这个条件检查?

让我们承认,这是非常困难的,因为如果我正确理解你的问题,你正在寻找的JSON 是动态的。

空手道的一部分乐趣是,至少有5种不同的方式可以让我想到优雅地解决这个问题。这里只是一个:

* def response = { color: 'black', aaa: 'foo' } 

* def schema = { color: '#? _ == "black" || _ == "white"' } 
* def extra = (response.color == 'black' ? { aaa: '#string' } : { fff: '#string' }) 

* match response contains schema 
* match response contains extra 

如果你基于上面的提示创建一个JS函数,你可能会得到一个更好的解决方案。请记住,在JS函数中,您可以使用诸如karate.set之类的方法动态创建密钥。所以有很多的可能性:)

编辑:看起来像上面的例子是错误的,关键是不是动态。那么很容易,记住,$指JSON根:

* def response = { color: 'black', extra: 'foo' }  
* def schema = { color: '#? _ == "black" || _ == "white"', extra: '#($.color == "black" ? "foo" : "bar")' }  
* match response == schema 
+0

感谢您所有的快速回复。我知道如何在功能上做到这一点,感谢空手道官方tuto,但我想在一个json文件中做到这一点。这个想法是,将只有一个json文件的*模式,不同的功能将使用它作为响应验证。我如何在json文件中做同样的事情? – nirind

+0

JSON密钥不是动态的 – nirind

+0

确定请参阅我的编辑:\ –