繁体   English   中英

如何编写jest测试脚本来检查常量的值

[英]How to write jest test script to check the value of constants

我有一个像这样定义的常量列表

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

具有in对象的对象是为了帮助知识分子,所以开发人员可以随着时间的推移缩小范围。

我想使用jest来编写一个测试,它将检查以确保没有2个常量具有相同的值,无论深度如何,否则它可能会创建非常奇怪的错误,这些错误在运行时很难调试。 我真的不了解文档以及如何做到这一点。 https://jestjs.io/docs/en/using-matchers但这是我第一次进行任何单元测试。

谢谢

-编辑

这就是我到目前为止所拥有的。 根据贾里德史密斯的评论,我没有接近正确的答案,因为这太简单了。 它只发现了第一个错误,而不是所有错误。

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)
    })
  })
})

首先,您可以获得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' ]

然后测试数组是否包含任何重复项:

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();
  })
})

希望能帮助到你!

对这种复杂性的单元测试可能有其自己的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM