Javascript 对于使用tv4的模式响应,Postman始终作为true有效

Javascript 对于使用tv4的模式响应,Postman始终作为true有效,javascript,json,rest,postman,tv4,Javascript,Json,Rest,Postman,Tv4,我做了很多测试,但我找不到解决方法。简化一下,我有一个Postman测试脚本来验证JSON响应是否符合此API定义的JSON模式: const stockQuotesSchema = JSON.parse(pm.environment.get("schema")); pm.test("Stock quote returns 200 OK", function () { pm.response.to.have.status(200); }) pm.test("Stock quote i

我做了很多测试,但我找不到解决方法。简化一下,我有一个Postman测试脚本来验证JSON响应是否符合此API定义的JSON模式:

const stockQuotesSchema = JSON.parse(pm.environment.get("schema"));

pm.test("Stock quote returns 200 OK", function () {
    pm.response.to.have.status(200);
})

pm.test("Stock quote is JSON", function () {
    pm.response.to.be.json;
})

pm.test("Stock quote response matches schema", function () {
    const validationResult = tv4.validateResult(pm.response.json(), stockQuotesSchema);
    pm.expect(validationResult.valid).to.be.true;
})
这是定义的API模式(简化):

这是我在运行请求后得到的响应:

{
    "code": "UNAUTHENTICATED",
    "message": "token expired"
}
由于模式中不存在“code”字段和“message”字段,我希望得到一个FAIL,但我总是检索一个True


我需要用一个长JSON模式来验证每个响应(我指的是比上面示例更大的模式)。有什么想法吗?谢谢。

如前所述,您可以通过添加
validateResult
的参数来强制执行建议的(然后删除)。例如:

const tv4 = require('tv4');

const schema = {
    properties: {
        codexxx: {
          type: 'string'
        },
        messagexxx: {
          type: 'string'
        }
    }
};

const invalidResponse = {
    code: 'UNAUTHENTICATED',
    message: 'token expired'
};

const validResponse = {
    codexxx: 'UNAUTHENTICATED',
    messagexxx: 'token expired'
};

const invalidRelaxedResult = tv4.validateResult(invalidResponse, schema);
const validRelaxedResult = tv4.validateResult(validResponse, schema);
const invalidStrictResult = tv4.validateResult(invalidResponse, schema, false, true);
const validStrictResult = tv4.validateResult(validResponse, schema, false, true);

console.log('Relaxed (invalid):', invalidRelaxedResult.valid);
console.log('Relaxed (valid):', validRelaxedResult.valid);
console.log('Strict (invalid):', invalidStrictResult.valid,
            invalidStrictResult.error.message, invalidStrictResult.error.dataPath);
console.log('Strict (valid):', validStrictResult.valid);
哪些产出:

Relaxed (invalid): true
Relaxed (valid): true
Strict (invalid): false Unknown property (not in schema) /code
Strict (valid): true

validateResult
的第三个参数指定是否执行递归检查。目前还不清楚,但我认为默认值为false(如上例所示)。

谢谢@msbit。尝试你的代码我得到了放松:真和严格:(空)。假设empty为false,我如何知道JSON的哪一部分是无效的?因为我有一个很长的JSON定义了我应该验证的API。嗯,你应该得到
false
而不是空的,也许可以看看
strictResult
的完整值(例如
console.log('Strict:',strictResult);
)。对我来说,它有
error
valid
字段(除其他字段外),并且
error
有其他字段详细说明错误(在本例中,
code
为1000表示未知属性,
dataPath
表示未知属性),现在看看strictResult的完整值,我看到:
Strict:error:{message:“未知属性(不在架构中)”,name:“ValidationError”type:“error”},missing:[valid:false]
。所以,它的答案是“false”,但它并没有指出什么关键字是错误的。另一件事,如果我将相同的
const schema
值放入
const response
,我也会得到完全相同的错误。这很奇怪。我在macOS High Sierra和Windows 10上运行的最后两个Postman版本中尝试了它。如果您尝试在模式和响应变量中使用相同的值,或者使用不同的值,您会在Strict中得到不同的结果吗?啊,看起来需要对模式进行不同的定义。我将用我的发现更新我答案中的代码。
Relaxed (invalid): true
Relaxed (valid): true
Strict (invalid): false Unknown property (not in schema) /code
Strict (valid): true