如何用Chai expect断言API响应为两个预期JSON之一?
Chai Expect断言匹配两个预期JSON之一的实现方法
嘿,我之前也碰到过一模一样的需求!Chai的deep.equal本身确实不支持直接传入多个预期值,但我们有几种简洁靠谱的方式来实现“实际响应匹配两个固定JSON中的任意一个”的断言逻辑,下面给你详细拆解:
方案一:使用Chai 4+的or链式断言(首推)
如果你用的是Chai 4.x及以上版本,直接用链式的or语法就能轻松搞定,代码直观到不行:
expect(actualResponse).to.deep.equal(expectedJson1) .or.deep.equal(expectedJson2);
这个写法的逻辑很直白:断言实际响应要么和expectedJson1深度相等,要么和expectedJson2深度相等。只要满足其中一个条件,断言就通过;如果两个都不匹配,才会抛出断言失败的错误。
方案二:使用satisfy自定义判断逻辑
要是你的Chai版本比较旧(比如3.x),不支持or语法,可以用satisfy方法结合深度比较来实现。这里可以借助Node.js内置的util.deepEqual(也可以用lodash的isEqual这类工具函数,看你项目里的依赖情况):
const { deepEqual } = require('util'); expect(actualResponse).to.satisfy(response => { return deepEqual(response, expectedJson1) || deepEqual(response, expectedJson2); });
satisfy会接受一个判断函数,只要函数返回true,断言就通过。我们在函数里判断实际响应是否和两个预期JSON中的任意一个深度相等就好。
另外,也可以直接在satisfy里嵌套Chai自己的deep.equal断言,但这种写法会在第一个断言失败时就抛出错误,更适合你确定两个预期值完全互斥的场景:
expect(actualResponse).to.satisfy(response => { try { expect(response).to.deep.equal(expectedJson1); return true; } catch (e) { expect(response).to.deep.equal(expectedJson2); return true; } });
不过这种写法相对繁琐,还是优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Sushil Verma
相关产品推荐
相关产品推荐

