Как проверить отсутствие (потенциально) вложенных свойств JSON в Postman? - PullRequest
1 голос
/ 17 мая 2019

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

Проверка должна завершиться неудачей, если ответ выглядит следующим образом

A:

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

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

B:

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

C:

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

D:

{
    "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, которая предоставляет эту функцию, или я вынужден реализовать рекурсивную вспомогательную функцию дляэто дело?

Ответы [ 3 ]

1 голос
/ 20 мая 2019

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

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

0 голосов
/ 20 мая 2019

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

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;
});
0 голосов
/ 17 мая 2019

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

Во-первых, преобразуйте 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.log(JSON.stringify(c).includes('"' + property + '"'))
  // True = property is present | False = property is absent
})
...