如何编写Jest测试脚本以检查常量的值

时间:2019-05-06 19:24:12

标签: javascript jestjs

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

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对象的对象有助于智能感知,因此开发人员可以随心所欲地缩小范围。

我想用玩笑的话来编写一个测试,以确保没有2个常量具有相同的值(无论深度如何),否则它会产生非常奇怪的错误,难以在运行时进行调试。我不太了解文档以及如何执行此操作。 https://jestjs.io/docs/en/using-matchers但这是我第一次进行任何单元测试。

谢谢

-编辑

这是我到目前为止所拥有的。根据贾里德·史密斯(Jared Smiths)的评论,我离正确答案不远,因为这太简单了。它只会找到第一个错误,而不是全部。

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 个答案:

答案 0 :(得分:1)

首先,您可以获取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();
  })
})

希望有帮助!

答案 1 :(得分:1)

具有这种复杂性的单元测试可能有其自身的matcher,您可以像这样递归定义:

 function get_child_cat() {


    var parentID = $('#parent-cat').val();

     $.ajax({
        url: "/Ecom/parsers/prod-child-cat.php",
        method: "POST",
        data: {parentID: parentID},
        success: function(data) {
            $('#child-cat').html(data);
        },
        error: function() {
            alert('something went wrong')
        }
    });

}

$('#parent-cat').on('change', function() {

    get_child_cat();
});

如文档中所述,与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来存储到目前为止找到的值,因为使用has()的查找平均时间为O(1)时间,而使用includes()的查找平均时间为O(n)

要在您的情况下使用上述匹配器:

Array

在这种情况下,它将完成并显示错误:

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