Тестирование Frisby.js с необязательным массивом объектов
Как вы можете использовать Frisby.js для тестирования необязательного массива, который содержит объекты? Например, скажем, у нас есть вызов API, который возвращает что-то вроде этого:
{
"id": "123",
"type": "A",
"list": [
{
"id": "111",
"size": 1
},
{
"id": "222",
"size": 2
}
]
}
Тем не менее, он также может вернуть что-то вроде этого:
{
"id": "456",
"type": "B"
}
В настоящее время я пытаюсь:
const frisby = require('frisby');
const Joi = frisby.Joi;
test('myTest', () => {
return frisby
.get(myUrl)
.expect('status', 200)
.expect('jsonTypes', {
id: Joi.string().required(),
type: Joi.string().required().
list: Joi.array().optional()
})
.expect('jsonTypes', 'list.*', {
id: Joi.string().required(),
size: Joi.number().required()
});
});
Однако это не сработает, поскольку путь (list.*) Не будет определен, если атрибут списка не существует. Есть идеи?
1 ответ
Таким образом, вы можете сделать это:
.expect('jsonTypes',"data", {
id: Joi.number(),
type: Joi.string()
})
.expect('jsonTypes', "data.list",Joi.array().items({
"id": Joi.number(),
"size": Joi.number()
}))
.then(function(res) {
var body = res.body;
body = JSON.parse(body);
expect(body.data.id).toBeDefined();
expect(body.data.type).toBeDefined();
if(body.data.list) {
for(var i = 0; i < body.data.list.length; i++){
expect(body.data.list[i].id).toBeDefined();
expect(body.data.list[i].type).toBeDefined();
}
}
У меня есть работа вокруг, пока кто-то не придумает более эффективный метод. Этот метод просто кажется неэффективным, потому что он требует нескольких вызовов API. Суть в том, чтобы сначала проверить, существует ли необязательный массив. Если это так, вы можете использовать другой вызов API и использовать путь для выполнения соответствующих проверок.
const frisby = require('frisby');
const Joi = frisby.Joi;
test('myTest', () => {
return frisby
.get(myUrl)
.expect('status', 200)
.expect('jsonTypes', {
id: Joi.string().required(),
type: Joi.string().required().
list: Joi.array().optional()
})
.then(function (response) {
if(response._json.list) {
return frisby
.get(myUrl)
.expect('jsonTypes', 'list.*', {
id: Joi.string().required(),
size: Joi.number().required()
});
}
});
});