我正在用jest编写一个测试用例来测试从一个方法返回的数据。这个方法返回非重复元素的数组。现在我正在尝试用jest中的expect()来测试从方法返回的数组是否只有唯一的元素。从方法返回的数组
arr = [ 'Pizza' ,'Burger' , 'HotDogs'] // All elements are unique
有没有像下面这样的jest matchers来检查数组中不重复的元素?
expect(arr).toBeUnique()
或者应该使用现有匹配器来完成任何逻辑?
g0czyy6m1#
没有内置的方法来检查数组是否有唯一的值,但我建议这样做:
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
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
tpgth1q72#
这与Yevhen's answer非常相似,但我更改了错误消息以描述遇到的第一个重复项,如下所示
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}]`, }; }, });
2条答案
按热度按时间g0czyy6m1#
没有内置的方法来检查数组是否有唯一的值,但我建议这样做:
您可以使用
expect.extend
向Jest添加自己的匹配器。例如:
并使用它:
tpgth1q72#
这与Yevhen's answer非常相似,但我更改了错误消息以描述遇到的第一个重复项,如下所示
以数组排序为代价