【问题标题】:JEST : Expect() only unique elements in an arrayJEST:Expect() 仅数组中的唯一元素
【发布时间】:2019-07-12 06:24:50
【问题描述】:

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

方法返回的数组

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

是否有像下面这样的笑话匹配器来检查数组中的非重复元素?

expect(arr).toBeUnique()

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

【问题讨论】:

标签: mongodb testing jestjs


【解决方案1】:

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

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

【讨论】:

  • 顺便说一下,你能解释一下这行和 Set(recieved) 是什么意思..const pass = Array.isArray(received) && new Set(received).size === received.length;
  • 是的,Array.isArray(receivedArray) - 方法确定传递的值是否为数组。 Set 是 ES6 中引入的新数据结构,Set 中的一个值可能只出现一次;它在 Set 的系列中是独一无二的。因此,如果我们将具有非唯一值的数组放入new Set(arr),我们将得到一个具有唯一值的数组,因为正如我所说,Set 中的值只出现一次。然后我们只检查新的(只有唯一值)数组和接收到的数组的大小,如果数组的长度在new Set(arr) 之后没有改变,则意味着给定数组中没有唯一值。
  • 请注意,此解决方案有效,但仅适用于文字数组元素 - 对于对象,该集合将包含重复元素,因为它只执行浅层相等检查。 This answer 提供了一个可行的(如果有点讨厌)解决方法。
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多