Почтальон всегда действителен как истинный ответ со схемой с использованием 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"
}

Поскольку поля «код» и «сообщение» не существуют в схеме, я надеюсь получить FAIL, но я всегда получаю True.

Это изображение результата Postman

Мне нужно проверять каждый ответ длинной схемой JSON (я имею в виду схему большего размера, чем в приведенном выше примере). Любая идея? Спасибо.


person Sebastian Diaz    schedule 21.09.2018    source источник


Ответы (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 (как показано в примере выше).

person msbit    schedule 21.09.2018
comment
Спасибо @msbit. Пробуя ваш код, я получаю Relaxed: ture и Strict: (пусто). Предположим, что пустое значение ложно, как я могу узнать, какая часть JSON недействительна? Потому что у меня очень длинный JSON, определяющий API, который я должен проверить. - person Sebastian Diaz; 24.09.2018
comment
Хм, вы должны получить false вместо пустого, возможно, посмотрите на полное значение strictResult (например, console.log('Strict:', strictResult);). Для меня у него есть поля error и valid (среди прочего), и error имеет дополнительные поля, в которых подробно описывается ошибка (в данном случае code, который равен 1000, чтобы указать неизвестное свойство, и dataPath, чтобы указать, какое свойство неизвестно). - person msbit; 24.09.2018
comment
Хорошо, теперь взглянув на полное значение strictResult, я вижу следующее: Strict: error: { message:"Unknown property (not in schema)", name:"ValidationError" type:"Error"}, missing: [valid:false]. Итак, он отвечает «ложно», но не указывает, какое ключевое слово неверно. Другое дело, если я помещаю те же значения const schema в const response, я также получаю точно такую ​​же ошибку. Это очень странно. Я пробовал это в двух последних версиях Postman, работающих на macOS High Sierra и Windows 10. - person Sebastian Diaz; 24.09.2018
comment
Если вы попробуете использовать одинаковые значения в переменных схемы и ответа или разные, получите ли вы разные результаты в Strict? - person Sebastian Diaz; 24.09.2018
comment
Ах, похоже, схему нужно определить по-другому. Я собираюсь обновить код в своем ответе тем, что я нашел. - person msbit; 24.09.2018
comment
@SebastianDiaz обновлен с правильной структурой определения схемы. - person msbit; 24.09.2018
comment
Спасибо, это работает, как вы указываете. Я вижу, что когда tv4 находит недопустимое значение, он регистрирует это и не продолжает проверку остатка. Я продолжу готовить сценарий с этим решением. Спасибо еще раз! - person Sebastian Diaz; 25.09.2018