Как проверить правильность значений элементов в массивах с уверенностью
Я пытаюсь проверить некоторые свойства моего ответа, как показано в уверенном учебнике.
Проблема заключается в том, что при тестировании свойств внутри массива я могу проверить, как в примере, что они появляются, но не то, что они соответствуют другим свойствам элемента, как они должны.
Чтобы уточнить, скажем, у меня есть ответ из учебника (добавлен "приз")
{
"lotto":{
"lottoId":5,
"winning-numbers":[2,45,34,23,7,5,3],
"winners":[{
"winnerId":23,
"prize":5000,
"numbers":[2,45,34,23,3,5]
},{
"winnerId":54,
"prize":100000,
"numbers":[52,3,12,11,18,22]
}]
}
}
Я могу подтвердить, что winnerIds как 23 и 54
expect().
body("lotto.lottoId", equalTo(5)).
body("lotto.winners.winnderId", hasItems(23, 54)).
when().
get("/lotto");
и я мог бы подтвердить, что призы 500 и 100000, но я не могу подтвердить, что winnerId=23 имеет приз =500, а winnerId=54, приз =100000. В ответе будет показано winnerId=23 с призом = 100000, и тесты пройдут.
Я не могу использовать contains(), потому что элементы в массиве могут располагаться в любом порядке, поэтому мне нужно, чтобы пользователь containsInAnyOrder ().
1 ответ
Насколько я знаю, Rest-Assured позволяет проверять только прямое подтверждение. Для условной проверки вы должны использовать вместо этого jsonpath:
$.lotto.winners.[?(@.winnerId==23)].prize
Выше jsonpath ищет winners
массив под lotto
и выбирает элемент массива, который имеет winnerId==23
и затем получает приз;
expect().
body("$.lotto.winners.[?(@.winnerId==23)].prize", equalTo(5000)).
when().
get("/lotto");
Есть другие посты в SO, на которые вы можете ссылаться, здесь и здесь.
Попробуйте выражение в этой ссылке
Синтаксис выражения JsonPath можно найти здесь.
Используя hamcrest, обратите внимание, что один элемент в списке победителей рассматривается как карта.
@Test
void test() {
expect()
.body("lotto.lottoId", equalTo(5))
.body("lotto.winners.", allOf(
hasWinner(23, 5000),
hasWinner(54, 100000)
))
.when()
.get("/lotto");
}
private Matcher<Iterable<? super Map<? extends String, ? extends Integer>>> hasWinner(int winnerId, int prize) {
return hasItem(allOf(
hasEntry(equalTo("winnerId"), equalTo(winnerId)),
hasEntry(equalTo("prize"), equalTo(prize))
));
}