无法使用 tv4 验证完整的 JSON 架构
Posted
技术标签:
【中文标题】无法使用 tv4 验证完整的 JSON 架构【英文标题】:Unable to validate complete JSON schema using tv4 【发布时间】:2021-09-06 17:46:12 【问题描述】:这里是新手。
我想知道是否有人可以提供帮助,因为我不知所措!我试图断言来自 GET API 调用的响应符合这个怪物模式集 - 使用 console.log() 看起来每个属性都已成功访问,如果我更改对象类型,测试将失败,因为我期待。
处理模式 - 如果我尝试更改数据数组中的属性,即从字符串更改为布尔值,测试仍将通过,尽管它不符合我定义的所需模式,
非常感谢任何指导!
//Test the schema is valid
const schema =
"type": "object",
"properties":
"current_page":
"type": "integer"
,
"data":
"type": "array",
"properties":
"id":
"type": "integer"
,
"first_name":
"type": "string"
,
"last_name":
"type": "string"
,
"telephone":
"type": "string"
,
"postcode":
"type": "string"
,
"date_of_birth":
"type": "string"
,
"profession":
"type": "string"
,
"time_served":
"type": "integer"
,
"national_insurance_number":
"type": "string"
,
"employer":
"type": "string"
,
"lco_id":
"type": "integer"
,
"company_employed":
"type": "null"
,
"company_employed_email":
"type": "null"
,
"company_employed_telephone":
"type": "string"
,
"company_employed_address":
"type": "null"
,
"apprentice":
"type": "boolean"
,
"apprentice_trade":
"type": "string"
,
"apprentice_course":
"type": "string"
,
"apprentice_started_at":
"type": "string"
,
"apprentice_ended_at":
"type": "string"
,
"work_experience":
"type": "boolean"
,
"work_experience_trade":
"type": "null"
,
"work_experience_education":
"type": "null"
,
"work_experience_started_at":
"type": "null"
,
"work_experience_ended_at":
"type": "null"
,
"nvq":
"type": "boolean"
,
"nvq_trade":
"type": "string"
,
"nvq_education":
"type": "string"
,
"nvq_started_at":
"type": "string"
,
"nvq_ended_at":
"type": "string"
,
"unemployed":
"type": "boolean"
,
"unemployed_months":
"type": "null"
,
"company_employed_postcode":
"type": "string"
,
"partner_relationship":
"type": "null"
,
"self_partner_relationship":
"type": "null"
,
"emergency_contact_first_name":
"type": "string"
,
"emergency_contact_last_name":
"type": "string"
,
"emergency_contact_telephone":
"type": "string"
,
"enrollment_id":
"type": "integer"
,
"created_at":
"type": "string"
,
"updated_at":
"type": "string"
,
"mode_of_travel":
"type": "string"
,
"driver_or_passenger":
"type": "string"
,
"fuel_type":
"type": "string"
,
"engine_capacity":
"type": "string"
,
"rtw_declaration":
"type": "boolean"
,
"rtw_proof1_upload_id":
"type": "null"
,
"rtw_proof2_upload_id":
"type": "null"
,
"card_type":
"type": "string"
,
"gender":
"type": "string"
,
"self_gender":
"type": "null"
,
"marital_status":
"type": "string"
,
"disability_act":
"type": "string"
,
"disability_description":
"type": "null"
,
"ethnic_origin":
"type": "string"
,
"religion":
"type": "string"
,
"nationality":
"type": "string"
,
"sexual_orient":
"type": "string"
,
"checked_membership":
"type": "integer"
,
"training_checked":
"type": "integer"
,
"enrollment":
"type": "object",
"properties":
"id":
"type": "integer"
,
"inducted":
"type": "boolean"
,
"user_id":
"type": "integer"
,
"created_at":
"type": "string"
,
"updated_at":
"type": "string"
,
"expiry_date":
"type": "string"
,
"user":
"type": "object",
"properties":
"id":
"type": "integer"
,
"email":
"type": "string"
,
"role":
"type": "integer"
,
"created_at":
"type": "string"
,
"updated_at":
"type": "string"
,
"state":
"type": "integer"
,
"last_login_at":
"type": "null"
,
"required": [
"id",
"email",
"role",
"created_at",
"updated_at",
"state",
"last_login_at"
]
,
"required": [
"id",
"inducted",
"user_id",
"created_at",
"updated_at",
"expiry_date",
"user"
]
,
"required": [
"id",
"first_name",
"last_name",
"telephone",
"postcode",
"date_of_birth",
"profession",
"time_served",
"national_insurance_number",
"employer",
"lco_id",
"company_employed",
"company_employed_email",
"company_employed_telephone",
"company_employed_address",
"apprentice",
"apprentice_trade",
"apprentice_course",
"apprentice_started_at",
"apprentice_ended_at",
"work_experience",
"work_experience_trade",
"work_experience_education",
"work_experience_started_at",
"work_experience_ended_at",
"nvq",
"nvq_trade",
"nvq_education",
"nvq_started_at",
"nvq_ended_at",
"unemployed",
"unemployed_months",
"company_employed_postcode",
"partner_relationship",
"self_partner_relationship",
"emergency_contact_first_name",
"emergency_contact_last_name",
"emergency_contact_telephone",
"enrollment_id",
"created_at",
"updated_at",
"mode_of_travel",
"driver_or_passenger",
"fuel_type",
"engine_capacity",
"rtw_declaration",
"rtw_proof1_upload_id",
"rtw_proof2_upload_id",
"card_type",
"gender",
"self_gender",
"marital_status",
"disability_act",
"disability_description",
"ethnic_origin",
"religion",
"nationality",
"sexual_orient",
"checked_membership",
"training_checked",
"enrollment",
]
,
// Use tiny validator to validate the results - Error if there are additional properties, and check recursion.
pm.test("Validate schema contains the relevant details", () =>
tv4.validateMultiple(jsonData, schema, true, true);
var jsonData = JSON.parse(responseBody);
// Log all errors to the console
var validationResult = tv4.validateMultiple(jsonData, schema, true, true);
for (var i = 0; i < validationResult.errors.length; i++)
console.log("path :" + validationResult.errors[i].dataPath + " message :" + validationResult.errors[i].message);
);
【问题讨论】:
如果包含敏感信息,您能否也发布回复或至少发布其结构。邮递员包括 AJV,这在这里可能会更好,所以你只需要在你的测试中使用pm.response.to.have.jsonSchema(schema)
而不是其余的。
数据数组如何具有属性?它是具有该属性的对象数组吗?
【参考方案1】:
const schema =
"type": "object",
"properties":
"current_page":
"type": "boolean"
pm.test("Validate schema contains the relevant details", () =>
var jsonData = "current_page": 2
// Log all errors to the console
var validationResult = tv4.validateMultiple(jsonData, schema, true, true);
validationResult.valid ? null : console.log(JSON.stringify(validationResult, null, 2))
pm.expect(validationResult.valid, JSON.stringify(validationResult, null, 2)).to.be.true
);
你不希望断言它,这就是它总是通过的原因,也正如 Danny 提到的那样使用
const schema =
"type": "object",
"properties":
"current_page":
"type": "boolean"
pm.test("Validate schema contains the relevant details", () =>
var jsonData = "current_page": 2
pm.response.to.have.jsonSchema(schema)
);
对于数组,您应该使用项目而不是属性:
const schema =
"type": "object",
"properties":
"data":
"type": "array",
"items":
"properties":
"id":
"type": "integer"
,
"name":
"type": "string"
,
"required":["id","name"]
pm.test("Validate schema contains the relevant details", () =>
var jsonData = "data": [ "id": 2,"name":"test" ]
// Log all errors to the console
var validationResult = tv4.validateMultiple(jsonData, schema, true, true);
validationResult.valid ? null : console.log(JSON.stringify(validationResult, null, 2))
pm.expect(validationResult.valid, JSON.stringify(validationResult, null, 2)).to.be.true
);
您可以使用以下方法轻松创建架构:
https://www.jsonschema.net/login
【讨论】:
以上是关于无法使用 tv4 验证完整的 JSON 架构的主要内容,如果未能解决你的问题,请参考以下文章
Room 无法验证数据完整性。如何在不编写迁移步骤的情况下修复它?