开玩笑:测试一个数组是否包含 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));
编辑:明确地说,我鄙视自定义匹配器。我已经在整理其他人的代码来修复错误,我不想也必须深入测试基础架构。断言应该简单明了。
我想验证给定的数组不包含任何值列表。有 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));
编辑:明确地说,我鄙视自定义匹配器。我已经在整理其他人的代码来修复错误,我不想也必须深入测试基础架构。断言应该简单明了。