Как написать скрипт jest test для проверки значения констант - PullRequest
3 голосов
/ 06 мая 2019

У меня есть список констант, определенных следующим образом:

const actions = {}
// Home
actions.HOME = {}
actions.HOME.SET_PROFILE_ID = 'SET_PROFILE_ID'
actions.HOME.LOAD_PROFILE = 'HOME_LOAD_PROFILE'
actions.HOME.SET_PROFILE = 'HOME_SET_PROFILE'

actions.OUTSIDE = {}
actions.OUTSIDE.UPDATE_PROFILE_ID = 'SET_PROFILE_ID' // this should error

module.exports = actions

Объекты, содержащиеся в объектах, призваны помочь intelisense, чтобы разработчики могли сузиться по ходу работы.

Я хочу использовать jestнаписать тест, который проверит, чтобы убедиться, что никакие 2 константы не имеют одинакового значения, независимо от глубины, иначе это может привести к очень странным ошибкам, которые трудно отладить во время выполнения.Я не очень понимаю документацию и как я могу это сделать.https://jestjs.io/docs/en/using-matchers Но я впервые делаю какие-либо юнит-тесты.

Спасибо

-Edit

Это то, что у меня есть до сих пор.Судя по комментариям Джареда Смита, я не близко к правильному ответу, так как это слишком просто.Он находит только первую ошибку, а не все.

describe('Actions.js', () => {
  it('verify no duplicate action values', () => {
    const flattenActions = []
    _.forEach(actions, store => {
      _.forEach(store, action => {
        flattenActions.push(action)
      })
    })
    const testedActions = []
    _.forEach(flattenActions, action => {
      expect(testedActions).not.toContain(action)
      testedActions.push(action)
    })
  })
})

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Модульный тест этой сложности, вероятно, заслуживает своего собственного matcher, который вы можете определить рекурсивно следующим образом:

expect.extend({
  toHaveUniqueValues(received) {
    const keys = []
    const values = new Set()

    function assertUniqueValues(object) {
      if (typeof object === 'object' && object !== null) {
        for (const key in object) {
          if (object.hasOwnProperty(key)) {
            keys.push(key)
            assertUniqueValues(object[key])
            keys.pop()
          }
        }
      } else if (values.has(object)) {
        throw new Error(`expected ${keys.join('.')} to not have duplicate value ${String(object)}`)
      }

      values.add(object)
    }

    try {
      assertUniqueValues(received)
      return {
        message: () => 'expected object to have duplicate values',
        pass: true
      }
    } catch (error) {
      return {
        message: () => error.message,
        pass: false
      }
    }
  }
})

Сообщение, сопровождающее pass: true, как объясняется в документации, возникает в случае, если тест отменяется, а отрицание теста заканчивается неудачей. Set предпочтительнее Array для хранения найденных значений, поскольку поиск с использованием has() в среднем составляет O (1) раз, тогда как includes() равен O (n) время.

Чтобы использовать вышеуказанное сопоставление в вашем случае:

describe('actions', () => {
  it('should not have duplicate values', () => {
    expect(actions).toHaveUniqueValues()
  })
})

В этом случае он завершится с ошибкой:

expected OUTSIDE.UPDATE_PROFILE_ID to not have duplicate value SET_PROFILE_ID
1 голос
/ 07 мая 2019

Прежде всего вы можете получить все значения вашего actions

function getDeepValues(obj) {
let values = [];
for (const key in obj) {
    if (typeof obj[key] === 'object') {
        const subVals = getDeepValues(obj[key]);
        values = [...values, ...subVals];
    } else {
        values.push(obj[key]);
    }
}
  return values;
}

Будет выводить что-то вроде этого:

[ 'SET_PROFILE_ID', 
  'HOME_LOAD_PROFILE', 
  'HOME_SET_PROFILE', 
  'SET_PROFILE_ID' ]

И затем вы проверяете, не массив лиt не содержит дубликатов:

function arrayHasNoDuplicate(arr) {
  return arr.every(num => arr.indexOf(num) === arr.lastIndexOf(num));
};

Теперь вы должны запустить свои тесты:

describe('Actions.js', () => {
it('verify no duplicate action values', () => {
  const actionsArray = getDeepValues(actions);
  const hasNoDuplicates = arrayHasNoDuplicate(actionsArray);
  expect(hasNoDuplicates).toBeTruthy();
  })
})

Надеюсь, это поможет!

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