2017-10-10 4 views
1

Ich möchte die Antwort von GET/Birds Anfrage mit einem JSON-Schema überprüfen. In meinem Feature:Wie überprüfe ich zusätzliche Werte mit if-Bedingung (mit Karate-Framework)?

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

Ich muss das Schema in eine JSON-Datei und nicht in das Feature. Ich muss zusätzliche Werte nach Geschlecht überprüfen. Bsp .: Wenn das Geschlecht männlich ist, dann überprüfe, ob die Farbe blau und der Schwanz lang oder kurz ist. Wenn das Geschlecht weiblich ist, dann überprüfe, ob "singt" wahr oder falsch ist und wie viele Eier es gibt.

Also habe ich in 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" 
      } 
     } 
    ] 
} 

Aber es funktioniert nicht. Fehler: com.intuit.karate.exception.KarateException: Pfad: $ [0] .type, aktuell: 'weiblich', erwartet: 'Objekt', Grund: ungleich. Wie kann ich diese bedingte Überprüfung in meiner JSON-Datei durchführen?

Antwort

1

Lassen Sie uns anerkennen, dass dies extra schwer ist, denn wenn ich Ihre Frage richtig verstehe, sind die JSON Schlüssel, die Sie suchen, dynamisch.

Teil des Spaßes von Karate ist, dass es mindestens 5 verschiedene Möglichkeiten gibt, die ich elegant lösen kann. Hier ist nur eine:

* 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 

Wenn Sie eine JS-Funktion basierend auf den Hinweis oben erstellt haben, können Sie wahrscheinlich eine bessere Lösung. Beachten Sie, dass Sie in einer JS-Funktion Methoden wie karate.set verwenden können, um Schlüssel dynamisch zu erstellen. So gibt es viele Möglichkeiten :)

edit: sieht aus wie das obige Beispiel ist falsch, und die Schlüssel sind nicht dynamisch. Dann ist es leicht, im Kopf behalten, dass $ auf die JSON Wurzel bezieht:

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

Dank für Ihre schnelle Antwort. Ich weiß, wie man dies in Features dank Karate offiziellen tuto, aber ich wollte dies in einer JSON-Datei tun. Die Idee ist, dass es nur eine JSON-Datei mit einem Schema für Räder geben wird und verschiedene Merkmale diese in Antwortvalidierungen verwenden werden. Wie kann ich das gleiche in JSON-Datei tun? – nirind

+0

JSON Schlüssel sind nicht dynamisch – nirind

+0

ok siehe meine Bearbeitung: \ –

Verwandte Themen