空手道:匹配时JSON转换为字符串([object Object])

Karate: JSON is converted to string ([object Object]) when matching

我正在尝试将 API 的响应与架构相匹配。我有以下设置。

这是功能文件:

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

这是保存响应模式的 JS 文件

var signup_response_schema = {
    "success": true,
    "message": "Successfully signed up.",
    "data": {
        "user": user_schema,
        "confirmation_url": "#string",
        "token": "#string",
        "role": "#array"
    }
};

问题是空手道似乎正在将响应模式转换为字符串。这是我收到的错误消息:

actual: {<response>}, expected: [object Object]

请注意,我可以很好地匹配单个字符串字段。只有当我尝试匹配对象时才会出现问题。另外,我尝试打印架构,变量似乎保存着正确的值,即架构对象。

我试过以下方法:

注意: 我是 运行 空手道 docker 如果这有什么不同的话。以下是我在 docker-compose 文件中使用的命令:

java -jar -Dkarate.config.dir=/app /app/karate-0.9.1.jar -T 5 path_to_file

空手道中的 JS 并非 无缝。这将起作用:

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);

通常在空手道中 *.js 文件以 function 开头并包含一个功能块。并且使用 def 将读取(评估)该块的结果分配给空手道变量。但是推荐给你的选项是这个,你在文件中只有一个 JSON,扩展名很重要:

Then match response == read('signup_response_schema.json')

请注意,read() 还将计算嵌入的表达式,这很有用。虽然JSON并不是严格意义上的well-formed,但还是推荐

这里的问题不是 JS 评估。变量 signup_response_schema 保存我在 JS 文件中分配给它的值。

问题出在模式的实际匹配上,因为实际响应中缺少一个键。空手道通常会抛出特定的错误消息,指示缺少哪些键,但出于某种原因,这里不是这种情况。