mongodb JEST:Expect()只包含数组中唯一的元素

u3r8eeie  于 2023-01-30  发布在  Go
关注(0)|答案(2)|浏览(121)

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

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

有没有像下面这样的jest matchers来检查数组中不重复的元素?

expect(arr).toBeUnique()

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

g0czyy6m

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({
       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
tpgth1q7

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}]`,
    };
  },
});

相关问题