2017-07-18 4 views
0

Ich habe das folgende JSON-Schema, das ich validieren möchte, und Python-Komponententest.Können JSON-Ganzzahlattribute referenziert werden?

{ 
    "properties": { 

     "traffic_parameters" { 

      "capacity": { 

       "oneOf": [ 
        { 
         "max_percentage": { 

          "type": "integer", 
          "minimum" : 1, 
          "maximum" : 150 
         }, 

         "min_percentage": { 

          "type": "integer", 
          "minimum" : 1, 
          "maximum" : { 

           "$ref": "#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum" 
          } 
         } 
        }, 

        { 
         "percentage_range": { 

          "type": "array", 
          "minItems": 1, 
          "maxItems": 10, 
          "items": { 

           "type": "integer" 
          } 
         } 
        } 
       ] 
      } 
     } 
    } 
} 

Mit jsonschema ich bestätigen das ganze Schemadatei OK. Beim Schreiben von Unittests bekomme ich jedoch den folgenden Fehler;

capacity = {'oneOf': [{'max_percentage': {'type': 'integer', 'minimum': 1, 'maximum': 150}, 'min_percentage': {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}}, {'percentage_range': {'type': 'array', 'minItems': 1, 'maxItems': 10, 'items': {'type': 'integer'}}}]} 
----------------------------------------- 
index0 = {'max_percentage': {'type': 'integer', 'minimum': 1, 'maximum': 150}, 'min_percentage': {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}}} 
----------------------------------------- 
min_percentage = {'type': 'integer', 'minimum': 1, 'maximum': {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'}} 
E......... 
====================================================================== 
ERROR: test_invalid_minimum__traffic_parameters__capacity__min_percentage (__main__.SchemaTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "test_test-variables_schema.py", line 160, in test_invalid_minimum__traffic_parameters__capacity__min_percentage 
    validate(0, min_percentage) 
    File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 540, in validate 
    cls.check_schema(schema) 
    File "/local/tools/PACKAGES/python3/lib/python3.6/site-packages/jsonschema/validators.py", line 83, in check_schema 
    raise SchemaError.create_from(error) 
jsonschema.exceptions.SchemaError: {'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'} is not of type 'number' 

Failed validating 'type' in schema['properties']['maximum']: 
    {'type': 'number'} 

On instance['maximum']: 
{'$ref': '#/properties/traffic_parameters/capacity/oneOf/max_percentage/minimum'} 


    FAILED (errors=1) 

Mein Test sind Python Unit-Tests, die das Minimum und Maximum des Attributs testen. Das Maximum ist ein Verweis auf ein anderes direkt oben definiertes Attribut.

Der gezeigte Test testet das Minimum, aber es ist der maximale Wert, der fehlerhaft ist. Der Fehler wäre der gleiche, wenn ich das Maximum testen würde, es ist genau das, woran ich gearbeitet habe.

Ich habe versucht, den Typ als "Integer" für "Maximum" neu zu spezifizieren, aber der Fehler bleibt.

Wie kann ich diesen Fehler umgehen, ohne den Typ des Attributs zu ändern? Die Referenz ist wichtig, weil das Maximum dieses Attributs direkt mit dem Minimum des vorherigen Attributs in Beziehung stehen soll.

Gibt es auch eine andere (leichtere) Möglichkeit, diese Variablen in Unittests zu referenzieren?

Hier ist die Funktion

def test_invalid_minimum__traffic_parameters__capacity__min_percentage(self): 
    global test_schema 

    capacity = test_schema["traffic_parameters"]["capacity"] 
    print ("capacity = " + str(capacity)) 
    print ("-----------------------------------------") 

    index0 = capacity["oneOf"][0] 
    print ("index0 = " + str(index0)) 
    print ("-----------------------------------------") 

    min_percentage = index0["min_percentage"] 
    print ("min_percentage = " + str(min_percentage)) 

    with self.assertRaises(ValidationError): 
     validate(0, min_percentage) 

Dank.

Antwort

1

Die JSON-Referenzspezifikation legt keine Begrenzungen fest, was $ref 'd sein kann, aber in der Praxis unterstützt jeder Validator, den ich je gesehen habe, nur $ref s, die auf ein JSON-Schema zeigen. Ich bin nicht sicher, warum niemand diese Funktionalität jemals unterstützt hat, aber ich habe noch einen Fall gesehen, in dem ich dachte, dass es eine gute Idee wäre, so etwas zu tun.

In dem kürzlich veröffentlichten JSON-Schema draft-06 wurde die gängige Praxis, nur JSON-Schemas zu unterstützen, zur Regel. Selbst wenn Sie einen Validator finden, der $ref ganze Zahlen unterstützt, würde ich es nicht empfehlen, weil es das Aufrüsten in Zukunft erschweren wird.

1

Dies wird nicht so funktionieren. $ref Referenzen müssen immer auf Schemas verweisen. Es kann also ein Objekt oder ein Boolescher Wert sein, aber keine Zahl.

Verwandte Themen