Сравните два объекта разных типов - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь написать тест для функции, которая принимает объект и отфильтровывает только те свойства, которые мне нужны, например:

const srcObj = {
 singleString: 'this',
 extraString: 'what?',
 singleNumber: 4,
 extraNumber: 0,
 singleObject: {
   prop: 'this'
 },
 extraObject: {
   nope: 'what is this'
  }
};

становится

const expected: Model = {
  singleString: 'this',
  singleNumber: 4,
  singleObject: {
    prop: 'this'
  }
};

Когда япопробуйте запустить тест

const modelObj = new Model()
const result = filterFunction(srcObj, modelObj)
expect(result).toEqual(expected)

Я получаю сообщение об ошибке

    Expected object to be a kind of Object, but was Model({ singleString: 'this', singleNumber: 4, singleObject: Object({  }) }).

Я попытался привести srcObj к Model в объявлении переменной (что, по-моему, побеждаетцель), приведение обоих объектов к одному и тому же в выражении ожидаемого (то есть expect(result as Model).toEqual(expected as Model), и приведение их обоих к any (expect(result as any).toEqual(expected as any))

Я уверен, что есть относительно незначительная вещь, которую яне хватает, чтобы этот тест заработал, но я не уверен, что это такое.

Редактировать

my filterfunction:

filterFunction(srcObj: any, destObj: any): any {
        var lSrcKeys: string[] = Object.keys(srcObj);
        var lDestKeys: string[] = Object.keys(destObj);
        var lSrcKeyFound: string = '';
        var lKeyType: string = '';
        var lKeyArrayType: string = '';

        lDestKeys.forEach((lDestKey) => {
            lSrcKeyFound = '';

            lSrcKeys.forEach((lSrcKey) => {
                if (lSrcKey.toLowerCase() === lDestKey.toLowerCase()) {
                    lSrcKeyFound = lSrcKey;
                }
            });

            if (lSrcKeyFound !== '') {
                lKeyType = Object.prototype.toString.call(srcObj[lSrcKeyFound]);

                if (lKeyType === '[object Array]' && srcObj[lSrcKeyFound].length) {
                    lKeyArrayType = Object.prototype.toString.call(srcObj[lSrcKeyFound][0]);

                    if (lKeyArrayType === '[object Object]') {
                        for (var i = 0; i < srcObj[lSrcKeyFound].length; i++) {
                            var lSrcArrayItem: any = srcObj[lSrcKeyFound][i];

                            destObj[lDestKey].push(ModelUtil.filterFunction(lSrcArrayItem, null));
                        }
                    } else {
                        destObj[lDestKey] = srcObj[lSrcKeyFound];
                    }
                } else if (lKeyType === '[object Object]') {
                    ModelUtil.filterFunction(srcObj[lSrcKeyFound], destObj[lDestKey]);
                } else {
                    destObj[lDestKey] = srcObj[lSrcKeyFound];
                }
            }
        });
        return destObj;
    }

1 Ответ

0 голосов
/ 20 сентября 2019

Похоже, это жасмин, проверяющий конструкторы, а не проблема машинописи

Вы можете выполнить деструктуру, чтобы получить их к одному и тому же конструктору

expect({...objOfTypeA}).toEqual({...objOfTypeB});

https://github.com/jasmine/jasmine/issues/598#issuecomment-340284189

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...