Тест почтальона, чтобы найти ключевое слово в массиве ответов
Я создаю тест в почтальоне, чтобы проверить ключевое слово "беременность" в каждом поле "имя" в JSON. Если каждое поле 'name' в JSON содержит ключевое слово, тогда пройдите тест, иначе произойдет сбой.
Найдите скрипт ниже, который я пробовал использовать
var jsonData = pm.response.json();
var resultCount = jsonData.length;
for (i=0;i<resultCount;i++){
var modelString = jsonData[i].name;
if(modelString.indexOf("Pregnancy") > 0)
{
tests["Each organisation name field " +i+ " contains \"Pregnancy\""] = modelString.has("Pregnancy");
}
else
{
pm.expect.fail("failed");
}
}
console.log("")
[
{
"id": "1-116992830",
"name": "British Pregnancy Advisory Service (BPAS)",
"numberOfLocations": 78
},
{
"id": "1-1560082724",
"name": "PAMS Pregnancy Ultrasound Centre (PAMS 3D & 4D Baby Imaging)",
"numberOfLocations": 1
},
{
"id": "1-2458518720",
"name": "Pregnancy Ultrasound Ltd (Babyface4d)",
"numberOfLocations": 1
},
{
"id": "1-101728376",
"name": "National Unplanned Pregnancy Advisory Service Limited",
"numberOfLocations": 23
},
{
"id": "1-3578030817",
"name": "Private Pregnancy Ultrasound Services Ltd trading as Expectancy Scanning Studios Ltd (Expectancy Scanning Studios Ltd)",
"numberOfLocations": 2
},
{
"id": "1-1412821832",
"name": "Foundation For Life (Salisbury) (Pregnancy Advice Salisbury)",
"numberOfLocations": 1
},
{
"id": "1-2028907839",
"name": "Miscarriage Clinic Limited (Centre for Reproductive Immunolgy and Pregnancy)",
"numberOfLocations": 1
},
{
"id": "1-744810951",
"name": "Foundation For Life (Tyneside Pregnancy Advice Centre)",
"numberOfLocations": 1
}
]
Я ожидаю, что если в каждом поле массива отсутствует слово "беременность", оно должно пройти проверку
2 ответа
Я добавил ваш JSON на https://api.myjson.com/bins/13qh7i чтобы создать API для тестирования под Postman, и добавил еще один объект в массив с именем, которое не имеет слова "беременность" в так что вы можете увидеть тест в действии.
Если вы просматриваете и проверяете objects
name
свойство для слова "беременность", и хранить те, которые находятся в hasPregnancy
array
затем вы можете проверить length
из array
против length
ответа API object array
чтобы увидеть, если каждый object
действительно содержит ключевое слово "беременность".
Ниже приведен код JS, который я использовал в тесте. Я также обновил ваш indexOf
быть includes
так как вы должны искать > -1 with indexOf
, Я также сделал modelString
переменная применяется toLowerCase()
на name
чтобы проверка не заботилась о капитализации и т. д.
// Get response
var jsonData = pm.response.json();
var resultCount = jsonData.length;
// Test arrays
var hasPregnancy = [];
var doesntHavePregnancy = [];
// Loop through and set arrays with matching data
for (i = 0; i < resultCount; i++) {
var id = jsonData[i].id;
var modelString = jsonData[i].name.toLowerCase();
if (modelString.includes("pregnancy")) {
hasPregnancy.push({
"id": id,
"hasPregnancy": modelString.has("pregnancy")
});
} else {
doesntHavePregnancy.push({
"id": id
});
}
}
// Check that each object in response contained keyword and length matches from test
pm.test("Expect response to contain pregnancy in each object", function() {
console.log(hasPregnancy);
console.log(doesntHavePregnancy);
pm.expect(hasPregnancy.length).to.equal(resultCount);
});
Используйте функцию сокращения ES6, которая накапливает результаты определения того, содержит ли имя каждого элемента "Беременность" при повторении ответа.
const jsonData = pm.response.json();
tests[`Each organisation name field contains \"Pregnancy\"`] = jsonData
.reduce((acc, org) => acc && org.name.toLowerCase().includes("pregnancy"));
- Вы обнаружите, что функции ES6, такие как map и lower, как правило, более выразительны
- С помощью
inlcudes
делает ваше намерение яснее, чемindexOf
- я добавил
toLowerCase()
поэтому совпадения нечувствительны к регистру