![](/img/trans.png)
[英]How to write unit test with jest to check if-else block that returns the same value
[英]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.