Почтальон всегда верен как истинный ответ со схемой, использующей tv4
Я сделал много тестов, но я не могу найти способ их решить. Упрощенно, у меня есть этот тестовый сценарий Postman для проверки того, что ответ JSON соответствует схеме JSON, определенной для этого API:
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:
{
"codexxx": "UNAUTHENTICATED",
"messagexxx": "token expired"
}
Это ответ, который я получаю после запуска запроса:
{
"code": "UNAUTHENTICATED",
"message": "token expired"
}
Так как поле "код" и поле "сообщение" не существует в схеме, я надеюсь получить СБОЙ, но я всегда получаю Истину.
Мне нужно проверить каждый ответ с длинной JSON-схемой (я имею в виду схему большего размера, чем в примере выше). Любая идея? Благодарю.
1 ответ
Вы можете применить предложенное (а затем удалить) banUnknownProperties
режим через дополнительные аргументы 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 (как указано в примере выше).