Karate: JSON wird beim Abgleich in einen String ([Objekt Objekt]) konvertiert
Ich versuche, die Antwort einer API mit einem Schema abzugleichen. Ich habe das folgende Setup.
Hier ist die Feature-Datei:
Feature: As a user, I would like to test APIs of member modules.
Background:
* def DIR_PATH = 'data/users/'
* def signup_request_helpers = read(<path_to_js_file>)
* def signup_response_helpers = read(<path_to_js_file>)
* def request_data = signup_request_data()
Scenario: Test signup of user
Given url my_url
And request request_data
When method POST
Then status 200
Then match response == signup_response_schema
Hier ist die JS-Datei, die das Antwortschema enthält
var signup_response_schema = {
"success": true,
"message": "Successfully signed up.",
"data": {
"user": user_schema,
"confirmation_url": "#string",
"token": "#string",
"role": "#array"
}
};
Das Problem ist, dass Karate das Antwortschema in einen String umzuwandeln scheint. Dies ist die Fehlermeldung, die ich erhalte:
actual: {<response>}, expected: [object Object]
Bitte beachten Sie, dass ich einzelne Zeichenfolgenfelder gut abgleichen kann. Das Problem tritt nur auf, wenn ich versuche, Objekte abzugleichen. Außerdem habe ich versucht, das Schema zu drucken, und die Variable scheint den richtigen Wert zu enthalten, nämlich das Schemaobjekt.
Ich habe folgendes versucht:
- Konvertieren Sie das Schema mithilfe der Anweisungen der Bibliothek in eine Zeichenfolge und dann in einen JSON. Dadurch wird das Schema nicht überprüft
- Konvertieren Sie direkt in json, wodurch das Schema weiterhin als dargestellt wird
[object Object]
HINWEIS: Ich verwende Karate auf Docker, wenn dies einen Unterschied macht. Das Folgende ist der Befehl, den ich in meiner Docker-Compose-Datei verwende:
java -jar -Dkarate.config.dir=/app /app/karate-0.9.1.jar -T 5 path_to_file
Antworten
JS im Karate ist nicht so nahtlos. Das wird funktionieren:
var temp = {
"success": true,
"message": "Successfully signed up.",
"data": {
"user": user_schema,
"confirmation_url": "#string",
"token": "#string",
"role": "#array"
}
};
karate.set('signup_response_schema', temp);
Normalerweise beginnen in Karate- *.jsDateien mit functionund enthalten einen einzelnen Funktionsblock. Und das Ergebnis des Lesens (Auswertens) dieses Blocks wird einer Karate-Variablen mit zugewiesen def. Die empfohlene Option für Sie ist jedoch die folgende: Sie haben nur einen JSON in der Datei, und die Erweiterung ist wichtig:
Then match response == read('signup_response_schema.json')
Beachten Sie, dass read()auch eingebettete Ausdrücke ausgewertet werden, was nützlich sein kann. Obwohl nicht erwartet wird, dass der JSON streng geformt ist, wird er empfohlen.
Das Problem hier war nicht die JS-Bewertung. Die Variable signup_response_schemaenthält den Wert, den ich ihr in der JS-Datei zugewiesen habe.
Das Problem bestand in der tatsächlichen Übereinstimmung des Schemas, da einer der Schlüssel in der tatsächlichen Antwort fehlte. Karate gibt normalerweise bestimmte Fehlermeldungen aus, die angeben, welche Schlüssel fehlten. Aus irgendeinem Grund ist dies hier jedoch nicht der Fall.