开玩笑:测试一个数组是否包含 none 这些值?

Jest: test that an array contains none of these values?

我想验证给定的数组不包含任何值列表。有 expect.arrayContaining 但我不明白应该如何使用它。

看这个例子:

expect(["1", "2", "3"]).not.toEqual(expect.arrayContaining(["3"])

此测试失败,这是预期的行为。我想验证数组中不包含“3”。一切顺利。

但是,现在我有多个值,如果数组包含其中任何一个,我希望测试失败。

expect(["1", "2", "3"]).not.toEqual(expect.arrayContaining(["3", "4"])

这个测试没有失败,尽管我预计它会失败,因为数组包含“3”。

我能做的是:

expect(["1", "2", "3"]).not.toEqual(expect.arrayContaining(["3"])
expect(["1", "2", "3"]).not.toEqual(expect.arrayContaining(["4"])
...

但是必须为每个值重复整个期望行似乎不是正确的方法。特别是当 arrayContaining 将一个数组作为参数时,看起来你只能传递一个有用的值给它。

我确定此行为有有效的用例,但我想问的是如何以更简洁的方式按用例实施。基本上,我希望一旦数组包含第二个数组的一个或多个值,测试就会失败。有点像“黑名单”。

我不会尝试让 Jest 检查您的数组是否相交,而是创建一个小函数来检查,然后对结果应用断言,例如

const doArraysIntersect 
 = (array1, array2) => array1.some(item1 => array2.includes(item1))

expect(doArraysIntersect(["1", "2", "3"], ["3"])).toBe(true);

我还建议像我在示例中所做的那样使用正逻辑(即尽量减少 not 的使用)作为负逻辑(例如负逻辑的多个实例,例如使用 shouldntHave 而不是同样的断言)可能更难推理。

编辑:明确地说,如果使用得当,我非常喜欢自定义匹配器。在整理其他人的代码以修复错误时,我不想在使用双重否定的测试中停下来。断言应该简单明了 :D

不要想太多完美匹配器,只需编写测试并继续:

const shouldntHave = [4,5,6];
const subject = [1,2,3]

shouldntHave.map(m => expect(subject).not.toContain(m));

编辑:明确地说,我鄙视自定义匹配器。我已经在整理其他人的代码来修复错误,我不想也必须深入测试基础架构。断言应该简单明了。