JEST :期望()只有数组中的唯一元素



我正在使用jest in编写一个测试用例来测试从方法返回的数据。该方法返回非重复元素的数组。现在我正在尝试在开玩笑中使用 expect() 来测试从该方法返回的数组是否只有唯一元素。

从方法返回的数组

arr = [ 'Pizza' ,'Burger' , 'HotDogs'] // All elements are unique

有没有像下面这样的开玩笑匹配器来检查数组中的非重复元素?

expect(arr).toBeUnique()

或者应该使用现有匹配器的任何逻辑?

没有内置的方法来检查数组是否具有唯一值,但我建议做这样的事情:

const goods = [ 'Pizza' ,'Burger' , 'HotDogs'];
const isArrayUnique = arr => Array.isArray(arr) && new Set(arr).size === arr.length; // add function to check that array is unique.
expect(isArrayUnique(goods)).toBeTruthy();

您可以使用expect.extend将自己的匹配器添加到 Jest。

例如:

expect.extend({
toBeDistinct(received) {
const pass = Array.isArray(received) && new Set(received).size === received.length;
if (pass) {
return {
message: () => `expected [${received}] array is unique`,
pass: true,
};
} else {
return {
message: () => `expected [${received}] array is not to unique`,
pass: false,
};
}
},
});

并使用它:

const goods = [ 'Pizza' ,'Burger' , 'HotDogs'];
const randomArr = [ 'Pizza' ,'Burger' , 'Pizza'];
expect(goods).toBeDistinct(); // Passed
expect(randomArr).toBeDistinct(); // Failed

这与 Yevhen 的答案非常相似,但我已更改错误消息以描述遇到的第一个重复项目,例如

item 3 is repeated in [1,2,3,3]

以对数组进行排序为代价

expect.extend({
toContainUniqueItems(received) {
const items = [...(received || [])];
items.sort();
for (let i = 0; i < items.length - 1; i++) {
if (items[i] === items[i + 1]) {
return {
pass: false,
message: () => `item ${items[i]} is repeated in [${items}]`,
};
}
}
return {
pass: true,
message: () => `all items are unique in [${items}]`,
};
},
});

最新更新