Почтальон всегда верен как истинный ответ со схемой, использующей tv4 - PullRequest
0 голосов
/ 22 сентября 2018

Я провел много тестов, но не могу найти способ их решить.Упрощенно, у меня есть этот тестовый сценарий 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"
}

Поскольку в схеме не существует поля "код" и "сообщение", я надеюсь получить сообщение ОШИБКА, ноЯ всегда получаю True.

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

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

1 Ответ

0 голосов
/ 22 сентября 2018

Вы можете принудительно применить предложенный (и затем удаленный) режим 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 (как указано в примере выше).

...