Mocha/Chai断言异常咨询:数组值相同却触发断言错误
Mocha/Chai数组断言失败?看这里!
我之前踩过完全一样的坑!你遇到的Unexpected Assertion Error根本不是数组内容不一致,问题出在你用的assert.equal()方法上——它对数组这种引用类型,比较的是两个值的内存地址是否相同,而不是数组里的元素是否匹配。
举个简单的例子:你代码里的a是splitNumAndOper函数返回的新数组,而断言里写的[6,'+',4,'+',3]是另一个全新创建的数组,这俩在内存里是两个独立的对象,哪怕元素完全一样,assert.equal()也会判定它们不相等。
解决方法很简单:用深比较断言
Chai专门提供了针对数组/对象内容比较的方法,根据你用的断言风格选就行:
如果你继续用assert风格(和你现有代码一致)
把assert.equal()换成assert.deepEqual(),它会递归检查两个值的内部结构和内容:
describe("Util.SplitNumAndOper Tests", function(){ it('should have "6+4+3" return [6,"+",4,"+",3]', function(){ let a = util.splitNumAndOper("6+4+3"); assert.deepEqual(a,[6,'+',4,'+',3]); // 替换成deepEqual }) })
要是你想试试更语义化的expect/should风格
可以这么写,可读性会更好:
// expect风格 expect(util.splitNumAndOper("6+4+3")).to.deep.equal([6,'+',4,'+',3]); // should风格 util.splitNumAndOper("6+4+3").should.deep.equal([6,'+',4,'+',3]);
小提醒
不光是数组,对象、嵌套结构的比较都会遇到这个问题——只要是引用类型,都别用equal()做浅比较,一定要用深比较的断言方法哦。
内容的提问来源于stack exchange,提问作者Vincent Tang
相关产品推荐
相关产品推荐

