Jest中检查数组是否不包含假值

3

我正在尝试使用Jest创建一个单元测试,以确保我的名为values的数组不包含假值。

但出于某些原因,这个测试不起作用 - 测试通过:

const badValues = ['', null, undefined, false, {}, []];
expect(values).toEqual(expect.not.arrayContaining(badValues));

以下代码按预期工作(测试失败),但肯定有一种正确的方法,而不是循环我的值?

for (const value of values) {
  expect(value).toBeTruthy();
}

2
{}[]都不是“falsy”。 - Pointy
@Pointy 你说对了一半。{} 不是假值,而 [] 实际上是假值。在你的浏览器中尝试 [] == false - user6269864
您的浏览器中尝试 [] ? alert("truthy") : alert("falsy") - Pointy
3
[] 表示一个空的数组,在任何情况下,指向任何对象的引用都会被认为是真值。使用==运算符不是测试这一点的好方法。 - Pointy
2个回答

3

如果 valuesbadValues 均为字符串或数字数组,而非对象,则可以遍历 badValues 并使用 includes() 方法进行迭代。

const badValues = ['', 'null', 'undefined', 'false', '{}', '[]'];

var values = [1,2,3,4,'null',5];


for(let i = 0; i<badValues.length; i++){

   if(values.includes(badValues[i])){
       console.log("bad value present");
       break;
   }

}

否则,我认为没有比迭代values更好的方法了。虽然使用test()和正则表达式可能是可行的,但[]{}在正则表达式中都是特殊字符。因此,我们应该对它们进行转义。

比较对象和数组是没有意义的,因为像[] === []{} === {}这样的比较总是返回false。.includes也不能用于它们。 - Jan Ciołek
@JanCiolek 是的,没错,我猜测op有字符串。就你的情况而言,没有迭代badvalues的方法。 - Emeeus

0

也许这个可以工作:

var isValid = arrayOfValuesToBeChecked.reduce(function(prev, elem) {
    // If elem is not truthy and if it is object, check its length 
    elem = elem ? typeof(elem) == 'object' ? elem instanceof Array ? elem.length : Object.keys(elem).length : elem : elem;
    return prev && elem;
}, true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接