【问题标题】:Check that array does not contain falsy values in Jest检查数组在 Jest 中是否不包含虚假值
【发布时间】:2018-08-25 13:34:52
【问题描述】:

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

由于某种原因这不起作用 - 测试通过:

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

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

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

【问题讨论】:

  • {}[] 都不是“假的”。
  • @Pointy 你说对了一半。 {} 不是假的,而[] 实际上是假的。在浏览器中尝试[] == false
  • 您的浏览器中尝试[] ? alert("truthy") : alert("falsy")
  • [] 是一个空数组,对 any 对象的引用总是真实的。 == 运算符不是测试它的好方法。

标签: javascript node.js unit-testing jestjs


【解决方案1】:

如果valuesbadValues 都是字符串或数字数组,而不是对象,则可以迭代badValuesincludes()

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不会与它们一起工作。
  • @JanCiolek 是的,没错,我猜 op 有字符串。在你的情况下,没有办法迭代坏值。
【解决方案2】:

也许这可以工作:

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);

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 2015-01-01
    • 2021-07-15
    • 1970-01-01
    • 2015-05-25
    • 2021-08-19
    • 2016-02-04
    相关资源
    最近更新 更多