Karate: JSON é convertido em string ([objeto Object]) ao combinar
Estou tentando combinar a resposta de uma API com um esquema. Eu tenho a seguinte configuração.
Aqui está o arquivo de recurso:
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
Aqui está o arquivo JS que contém o esquema de resposta
var signup_response_schema = {
"success": true,
"message": "Successfully signed up.",
"data": {
"user": user_schema,
"confirmation_url": "#string",
"token": "#string",
"role": "#array"
}
};
O problema é que o caratê parece estar convertendo o esquema de resposta em uma string. Esta é a mensagem de erro que recebo:
actual: {<response>}, expected: [object Object]
Observe que posso combinar campos de string individuais sem problemas. O problema só ocorre quando tento combinar objetos. Além disso, tentei imprimir o esquema e a variável parece estar mantendo o valor correto, que é o objeto do esquema.
Tentei o seguinte:
- Converta o esquema em uma string e em JSON usando as diretivas da biblioteca. Isso não verifica o esquema
- Converta diretamente para json, que ainda renderiza o esquema como
[object Object]
NOTA: Estou executando Karate no docker, se isso fizer alguma diferença. A seguir está o comando que uso em meu arquivo docker-compose:
java -jar -Dkarate.config.dir=/app /app/karate-0.9.1.jar -T 5 path_to_file
Respostas
JS em Karate não é que sem costura. Isso vai funcionar:
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);
Normalmente, no Karatê, os *.jsarquivos começam functione contêm um único bloco de funções. E o resultado da leitura (avaliação) desse bloco é atribuído a uma variável do Karate usando def. Mas a opção recomendada para você é esta, onde você tem apenas um JSON no arquivo e a extensão é importante:
Then match response == read('signup_response_schema.json')
Observe que read()também avaliará expressões incorporadas, o que pode ser útil. Embora não se espere que o JSON seja estritamente bem formado, ele é recomendado.
O problema aqui não era de avaliação JS. A variável signup_response_schemacontém o valor que atribuí a ela no arquivo JS.
O problema era com a correspondência real do esquema porque uma das chaves estava faltando na resposta real. O Karatê geralmente emite mensagens de erro específicas indicando quais chaves estavam faltando, mas por algum motivo, esse não é o caso aqui.