Как динамически проверить массив typeof внутри объекта? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть пользовательский объект - я хочу сгенерировать тест для каждого пользовательского свойства и проверить, правильный ли это тип.Однако, поскольку typeof массив является объектом, утверждение не выполняется в свойствах массива с «AssertionError: ожидается, что [1] будет объектом».

Поэтому я проверил, является ли свойство массивом, а затем сгенерировал для него специальный тест.Мне интересно, если это правильный подход?У меня такое чувство, что я что-то упускаю из виду.

Object.keys(pureUser).forEach(property =>{
    // since typeof array is an object we need to check this case separately or test will fail with expecting array to be an object
    if (Array.isArray(pureUser[property])) {
         it(`should have property ${property}, type: array`, function () {
             user.should.have.property(property);
           });
         } else {
             it(`should have property ${property}, type: ${(typeof pureUser[property])}`, function () {
                 user.should.have.property(property);
                 user[property].should.be.a(typeof pureUser[property]);
             });
         }
    });

pureUser выглядит примерно так:

let pureUser = {
    username: "JohnDoe123",
    id: 1,
    categories: [1,2,3,4]
}

Пользовательская переменная определяется в другом месте через got.js

1 Ответ

0 голосов
/ 22 апреля 2019

измените свой тест на pureUser[property].should.be.an.Array или user[property].should.be.an.Array

Foreach

Метод forEach () вызывает предоставленную функцию один раз для каждого элемента в массиве по порядку.

let pureUser = {
username: "JohnDoe123",
id: 1,
categories: [1,2,3,4]
}

Object.keys(pureUser).forEach(property =>{

        // since typeof array is an object we need to check this case separately or test will fail with expecting array to be an object
        if (Array.isArray(pureUser[property])) {
        
            console.log('Yes, it\'s an Array')
            //it(`should have property ${property}, type: array`, function () {
            //    user.should.have.property(property);
            //});
        } else {
            console.log('No, it\'s not an Array')
            //it(`should have property ${property}, type: ${(typeof property)}`, function () {
                //user.should.have.property(property);
               // user[property].should.be.a(typeof pureUser[property]);
            //});
        }

    });

Когда вы используете forEach в pureUser, параметром будут свойства объектов, такие как username, id и т. Д.

let pureUser = {
username: "JohnDoe123",
id: 1,
categories: [1,2,3,4]
}

Object.keys(pureUser).forEach(property =>{
  console.log(property);
});

Вы также можете получить доступ к массиву в вашей функции forEach.

arr.forEach(item, index, arr)
...