【问题标题】:tv4.validate always return true. Even if my schema not valid i.e.: var == "dummy"tv4.validate 总是返回 true。即使我的架构无效,即: var == "dummy"
【发布时间】:2019-05-19 21:53:43
【问题描述】:

tv4.validate 将始终返回 true。无论模式是有效的 JSON 还是只是虚拟字符串。我浏览 stackoverflow 以查找相关问题,而 banUnknownProperties 对我没有帮助

正如我所说,我什至尝试将架构变量更改为“虚拟”,而 tv4 仍然没有发现错误。那是我在 stackoverflow 上的第一篇文章。对不起,如果我的问题不清楚。

有效响应如下

[
  {
    "dayOfWeek": "sunday",
    "openTime": "10:00:00",
    "closeTime": "14:00:00"
  },
  {
    "dayOfWeek": "monday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "tuesday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "wednesday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "thursday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "friday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "saturday",
    "openTime": "7:00:00",
    "closeTime": "19:00:00"
  }
]

我使用https://jsonschema.net/ 获得了我的架构变量,这是由多个线程建议的。 您可以粘贴有效响应并将此 JSON 推断为 Schema。我不会在这里提供我的架构以节省空间。

这是我的测试代码:

var data = JSON.parse(responseBody);
var schema =pm.variables.get("getHoursSchema"); // copy paste schema from https://jsonschema.net/ and assigned to 'getHoursSchema' environment variable

tests["Valid 'Get business hours' schema"] = tv4.validate(data, schema, false, true);  
console.log("Schema error description, if any:" + tv4.error);

实际反应是:

{
    "error": {
        "name": "JsonWebTokenError",
        "message": "jwt malformed"
    }
}

而且 tv4 在这里没有看到任何错误

【问题讨论】:

    标签: postman json-schema-validator tv4


    【解决方案1】:

    Postman 变量存储为字符串。 TV4 需要一个对象。

    所以只需尝试在您的 pm.variables.get 上包装 JSON.parse:

    var schema = JSON.parse(pm.variables.get("getHoursSchema")); 
    

    通过此更改,我遇到了预期的架构验证错误。

    【讨论】:

    • 像魅力一样工作。我整天都在寻找解决方案谢谢!
    【解决方案2】:

    @DieGraueEminenz 的建议可能会有所帮助,但我认为那里可能还会发生其他事情,我很好奇您如何通过您正在做的事情获得对“JsonWebTokenError”的引用,您应该对此进行调查。

    但是关于您的架构问题,让我们通过在虚拟请求的预请求或测试脚本(例如 GET google.com)中使用以下代码来删除一些未知数

    var data = [
      {
        "dayOfWeek": "sundayX",
        "openTime": "10:00:00",
        "closeTime": "14:00:00"
      },
      {
        "dayOfWeek": "monday",
        "openTime": "9:00:00",
        "closeTime": "16:00:00"
      }
    ];
    
    const schema = {
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "type": "array",
      "items": {
        "type": "object",
        "required": [ "dayOfWeek", "openTime", "closeTime" ],
        "properties": {
          "dayOfWeek":  { "enum": [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday",  ] },
          "openTime": { "type": "string", "pattern": "^\\d+:\\d\\d:\\d\\d$" },
          "closeTime": { "type": "string", "pattern": "^\\d+:\\d\\d:\\d\\d$" },
        }
      }
    };
    
    const result = tv4.validateResult(data, schema);  
    console.log("Schema result:", result);
    

    我重新设计了您从 https://jsonschema.net/ 获得的架构,(实际上只检查您是否有字符串,仅此而已)上面 dayOfWeek 的枚举进行了更好的检查,时间值现在需要为 [n]n :nn:nn,我删除了一堆你不需要的额外位。

    我还会使用tv4.validateResult(...) 方法,因为它可以为您提供有关错误的更多信息。

    上面的示例输出是

    找出数据第一项中的故意错误。

    一旦您开始通过响应连接数据,如果您需要与其他请求共享架构,请将其保存到全局变量中

    pm.globals.set("schemaJSON",JSON.stringify(schema));
    

    并按如下方式获取它

    const schemaJSON = pm.globals.has("schemaJSON") && pm.globals.get("schemaJSON");
    const schema = schemaJSON && JSON.parse(schemaJSON);
    

    【讨论】:

    • Thats is a very good explanation and your reworked schema test my request much better then testing just a string type. I think this answer worth lots of upvotes. I didnt 之前知道“enum”和“pattern”,认为大家看看你的答案会很有价值。但我会接受@DieGraueEminenz 的回答,因为我认为这会对社区有所帮助。他为我的问题提供了简单快捷的解决方案。 JsonWebToken 错误是故意的。我应该提一下,对不起。
    • 我尝试了同样的方法,但是在“项目”标签内的元素没有验证。
    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2015-05-20
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多