Тестирование Frisby.js с необязательным массивом объектов - PullRequest
0 голосов
/ 20 ноября 2018

Как вы можете использовать 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. *) Не будет определен, если атрибут списка не существует. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Таким образом, вы можете сделать это:

     .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();
    }
}
0 голосов
/ 27 ноября 2018

У меня есть обходной путь, пока кто-нибудь не найдет более эффективный метод. Этот метод кажется просто неэффективным, потому что он требует нескольких вызовов 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()
                });
        }
    });
});
...