Лучший способ сравнить строку с глубоко вложенным строковым значением свойства объекта? - PullRequest
0 голосов
/ 06 апреля 2020

Я пишу тесты для функции и сталкиваюсь с проблемой. Я могу беспорядочно добиться того, чего хочу, но хочу сделать его немного более динамичным c.

Например, если у меня есть,

import { mapValues, isObject, forIn } from 'lodash';

const trimText = field => typeof field === 'string' ? field.replace(/^\s+|\s+$/g, '') : field;

const trimFields: any = data => mapValues(data, (element, k) => isObject(element) ? trimFields(element) : trimText(element));

const simpleObject = {
  fieldA: [' simple trim ', 'simple trim'],
  fieldB: [' new\n   line trim ', 'new\n   line trim'],
  fieldC: [' \n\ts\n\t\n ', 's']
};

Я могу написать тест для это как,

describe('Simple object /', () => {
  const objectToTrim: any = {};
  forIn(simpleObject, ([raw], key) => {
    objectToTrim[key] = raw;
  });

  const trimmedObject = trimFields(objectToTrim);
  forIn(trimmedObject, (value, key) => {
    it(`Should have properly trimmed ${value} into ${simpleObject[key][1]}`, () => {
      expect(value).toEqual(simpleObject[key][1]);
    });
  });
});

Но теперь я столкнулся с проблемой со сложным объектом. Например, если у меня есть:

const complexObject: any = {
  fieldA: [
    { subfieldA: ' simple trim ' },
    'simple trim'
  ],
  fieldB: [
    {
      subfieldB: {
        subSubFieldB: ' new\n   line trim '
      }
    },
    'new\n   line trim'
  ],
  fieldC: [
    {
      subfieldC: {
        subSubFieldC: {
          subSubSubfieldC: ' \n\ts\n\t\n '
        }
      }
    },
    's'
  ]
};

Я не уверен, как это проверить. Есть ли способ написать тест так же, как для простого объекта, но как-то найти вложенное значение? Например, с помощью loda sh (потому что я все равно уже использую это), можно ли найти subSubSubfieldC в fieldC и затем сравнить его с complexObject[key][1], как я сделал в expect(...) с simpleObject[key][1]

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете использовать it.each в Jest для предоставления различных входных данных (избегая использования loda sh), чтобы указать различные пути к объекту, и .toHaveProperty для соответствия пути и значения

пример (не проверено):

describe('Complex object', () => {
  let result;
  beforeAll(() => {
    result = trimFields({
      fieldA: [
        { subfieldA: ' simple trim ' },
        'simple trim'
      ],
      fieldB: [
        {
          subfieldB: {
            subSubFieldB: ' new\n   line trim '
          }
        },
        'new\n   line trim'
      ],
      fieldC: [
        {
          subfieldC: {
            subSubFieldC: {
              subSubSubfieldC: ' \n\ts\n\t\n '
            }
          }
        },
        's'
      ]
    })
  })

  it.each([
    ['fieldA.0.subfieldA', 'simple trim'],
    ['fieldA.1', 'simple trim'],
    ['fieldB.0.subfieldB.subSubFieldB', 'new line trim']
  ])('should have property %s with trimmed value %s', (path, value) => {
    expect(result).toHaveProperty(path, value);
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...