Как проверить отсутствие (потенциально) вложенных свойств JSON в Postman?

Я хочу проверить отсутствие вложенного свойства "x"

Тест должен провалиться, если ответ выглядит так

А:

{
    "first": 1,
    "second": {
        "one": 1,
        "two": 2,
        "three": {
            "x": 1,
            "y": 2
        }
    }
}

Но для следующих примеров он должен пройти:

Б:

{
    "first": 1,
    "second": {
        "one": 1,
        "two": 2,
        "three": {
            "y": 2
        }
    }
}

С:

{
    "first": 1,
    "second": {
        "one": 1,
        "two": 2
    }
}

Д:

{
    "first": 1
}

Конечно. Я могу использовать pm.expect(object).to.not.have.property("x") для проверки отсутствия. Но это не будет полезно во всех случаях.

Например, мой тестовый код PostMan:

pm.test("(nested)property 'x' not available", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.second.three).to.not.have.property("x")
});

будет отлично работать для случаев A и B, но не для C и D, потому что родительские "вторые" или "три" свойства могут быть неопределенными. Но я не хочу проверять их отсутствие, потому что это не цель этого конкретного теста.

Есть ли какая-либо функция BDD Chai, которая обеспечивает эту функциональность, или я вынужден реализовать рекурсивную вспомогательную функцию для этого случая?

Можете ли вы использовать какие-либо функции Lodash для большей разбивки данных, вместо того, чтобы пытаться сделать все это в выражении pm.expect(). Функция _.get() может быть полезна lodash.com/docs/4.17.11#получить

Danny Dainton 19.05.2019 10:36

@DannyDainton: Спасибо за этот замечательный совет. Это именно то, что я ищу. Пожалуйста, скопируйте содержание вашего комментария в качестве ответа в ветке, чтобы я мог его принять.

DieGraueEminenz 20.05.2019 08:33

Было бы неплохо увидеть ваше окончательное решение по этому вопросу, чтобы помочь другим людям понять, как вы использовали его для достижения своей цели.

Danny Dainton 20.05.2019 09:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
926
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это не совсем то, что вы ищете, но я надеюсь, что это может быть полезно для всех, кто заинтересован.

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

Конечно, это всего лишь концепция, но я думаю, что вы можете попробовать, если ничего не помогает.

Есть возможности для улучшения, я вижу. Так что смело настраивайте, если нужно.

const cases = [{
    "first": 1,
    "second": {
      "one": 1,
      "two": 2,
      "three": {
        "x": 1,
        "y": 2
      }
    }
  },
  {
    "first": 1,
    "second": {
      "one": 1,
      "two": 2,
      "three": {
        "y": 2
      }
    }
  },
  {
    "first": 1,
    "second": {
      "one": 1,
      "two": 2
    }
  },
  {
    "first": 1,
    "example": "notx"
  }
]
const property = "x" // Property that you are looking for its absence
cases.forEach(c => {
  console.info(JSON.stringify(c).includes('"' + property + '"'))
  // True = property is present | False = property is absent
})
Ответ принят как подходящий

Вы можете использовать встроенные функции Lodash для большей разбивки данных, вместо того, чтобы пытаться сделать все это в инструкции pm.expect().

Функция _.get() может быть полезной для изучения с помощью — https://lodash.com/docs/4.17.11#получить.

Мое окончательное решение:

var a = {
    "first": 1,
    "second": {
        "one": 1,
        "two": 2,
        "three": {
            "x": 1,
            "y": 2
        }
    }
};

var b = {
    "first": 1,
    "second": {
        "one": 1,
        "two": 2,
        "three": {
            "y": 2
        }
    }
};

var c = {
    "first": 1,
    "second": {
        "one": 1,
        "two": 2
    }
};

var d = {
    "first": 1
};


pm.test("(nested)property 'x' NOT available in 'a'", function () { //must fail for a
    var jsonData = a;
    pm.expect(_.get(jsonData, "second.three.x", undefined)).to.be.undefined;
});

pm.test("(nested)property 'x' NOT available in 'b'", function () {
    var jsonData = b;
    pm.expect(_.get(jsonData, "second.three.x", undefined)).to.be.undefined;
});

pm.test("(nested)property 'x' NOT available in 'c'", function () {
    var jsonData = c;
    pm.expect(_.get(jsonData, "second.three.x", undefined)).to.be.undefined;
});

pm.test("(nested)property 'x' NOT available in 'd'", function () {
    var jsonData = d;
    pm.expect(_.get(jsonData, "second.three.x", undefined)).to.be.undefined;
});

Другие вопросы по теме