Karate: JSON é convertido em string ([objeto Object]) ao combinar

Sep 09 2020

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

PeterThomas Sep 09 2020 at 16:42

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.

SaadAleem Sep 09 2020 at 18:07

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.