测试接收字符串与数组的函数时,数组参数匹配但断言失败
嘿,我来帮你捋捋这个问题!你遇到的情况其实是Jest对数组断言的两种逻辑搞混了,咱们一步步拆解:
为什么两种断言都失败?
- 第一种直接传
muniIDArray的方式:Jest用的是引用匹配(相当于toBe),它会检查调用时传入的数组是不是和muniIDArray是同一个对象实例——哪怕两个数组内容完全一样,只要是不同的数组对象,就会断言失败。 - 第二种
expect.arrayContaining(muniIDArray)的问题:这个匹配器是检查「接收的数组包含预期数组的所有元素」,但允许接收的数组有额外元素、或者元素顺序不同。如果你的测试要求数组完全匹配(元素、顺序、长度都一致),那这个匹配器就不符合你的需求,自然会报错。
正确的解决方案
根据你的需求(数组必须完全匹配),有两种靠谱的写法:
写法1:用expect.toEqual作为参数匹配器
直接在toHaveBeenCalledWith里用expect.toEqual来匹配数组内容,它会递归比较数组的每一个元素,不关心引用:
expect(context.commit).toHaveBeenCalledWith( 'loadMunicipalityIDArray', expect.toEqual(muniIDArray) );
写法2:单独提取调用参数再断言
这种方式更直观,还方便调试——你可以先打印出实际调用的参数,看看是不是和预期一致:
// 获取第一次调用的参数(如果调用多次,调整索引即可) const [mutationName, receivedArray] = context.commit.mock.calls[0]; // 分别断言 expect(mutationName).toBe('loadMunicipalityIDArray'); expect(receivedArray).toEqual(muniIDArray);
额外排查点
如果还是失败,建议你先打印context.commit.mock.calls看看实际传入的参数是什么:
console.log(context.commit.mock.calls);
检查这几个点:
- 实际传入的数组元素类型是不是和预期一致?比如预期是数字,实际传了字符串?
- 数组长度、元素顺序有没有偏差?
- 是不是
context.commit被调用了多次,你检查的不是正确的那一次?
内容的提问来源于stack exchange,提问作者Luuc van der Zee
相关产品推荐
相关产品推荐

