Я хочу проверить отсутствие вложенного свойства "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, которая обеспечивает эту функциональность, или я вынужден реализовать рекурсивную вспомогательную функцию для этого случая?
@DannyDainton: Спасибо за этот замечательный совет. Это именно то, что я ищу. Пожалуйста, скопируйте содержание вашего комментария в качестве ответа в ветке, чтобы я мог его принять.
Было бы неплохо увидеть ваше окончательное решение по этому вопросу, чтобы помочь другим людям понять, как вы использовали его для достижения своей цели.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это не совсем то, что вы ищете, но я надеюсь, что это может быть полезно для всех, кто заинтересован.
Сначала преобразуйте 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;
});
Можете ли вы использовать какие-либо функции Lodash для большей разбивки данных, вместо того, чтобы пытаться сделать все это в выражении
pm.expect(). Функция_.get()может быть полезна lodash.com/docs/4.17.11#получить