Chai-Http 框架中放弃 expect 进而使用 should 断言风险分析
在前端开发中,我们经常需要进行接口测试,而 Chai-Http 就是比较流行的一个 Node.js 的 HTTP 测试框架。在使用 Chai-Http 进行接口测试的过程中,一个比较重要的部分就是对返回结果进行断言。而 Chai-Http 中给出了两种选择:expect 和 should 断言。本文将从风险的角度分析应当如何选择断言方式。
- expect 断言的缺陷
在 Chai 中使用 expect 进行断言,常常需要长长的链式语句,看起来并不容易理解。例如以下代码:
expect(res.body).to.have.property('status', 'success') expect(res.body.data.length).to.be.above(0) expect(res.body).to.have.property('message', '获取数据成功')
使用 expect 断言的代码可读性比较差,使用过程中容易写出冗余代码,增加维护成本。此外,若在链式断言中间出现了错误,那么整个链式语句就无法执行,而且断言错误提示也并不清晰。
- should 断言的优点
Chai 中的 should 断言相对于 expect 语法更简洁,更易于阅读和维护。例如,使用 should 语法的代码如下所示:
res.body.status.should.equal('success') res.body.data.should.have.length.above(0) res.body.message.should.equal('获取数据成功')
除了简洁性之外,should 断言还可以在链式语句中非常灵活地进行错误提示和错误处理。它支持多种类型的运算符,如deep / nested compare、truthy、empty、length、type 等,使得使用 should 对结果进行断言时非常方便。
- 在使用 should 断言时的注意事项
虽然 should 断言在可读性和简洁性方面比 expect 有明显优势,但在实际使用过程中,也需要注意以下几点。
(1) 需要手动引入 should 库
在使用 should 断言时,需要手动引入 should 库,如果没有引入,在应用程序中直接调用 should 断言会出现错误。
const should = require('should')
(2) 对于 undefined 和 null 值的处理
由于 JavaScript 中 null 和 undefined 可以是在 boolean 表达式中的一个值,如果使用 should 的时候不加注意,可能会出现 false 的情况,从而造成错误。这时可以通过 should.exist 和 should.not.exist 方法来判断变量是否存在。
should.exist(res.body.data) should.not.exist(err)
(3) 对于异步调用的处理
在 Node.js 中,很多方法都是异步调用的,因此在使用 should 断言的时候,需要加上回调函数,在回调函数中执行下面的 expect 断言,正确的写法如下。
-- -------------------- ---- ------- ---------- ------ ------- --------- ---- -- - ------------ -------------- ---------------- -------- ---------- ---- -- - --------------------- --------------------------------------- ------ -- --展开代码
- 总结
在使用 Chai-Http 进行接口测试时,选择适合自己的断言方式非常重要。虽然 expect 断言在一些场景下更为灵活,但 should 断言在阅读性和健壮性两方面都更为优秀。在实际应用中,我们应当结合自身代码的实际情况,选择更合适的测试方式,并注意细节方面的问题,从而确保接口测试的准确性和健壮性。
最后,我们可以来看一下使用 should 断言的完整示例代码:
-- -------------------- ---- ------- ----- ------- - ---------------------------- ----- --- - ----------------- ----- ------ - ----------------- -------------- ----- -- -- - -------------- ------- -- -- - ---------- --- - --- ------ ------ -- - ------------ -------------- ---------------- ------- ---------- ---- -- - --------------------- --------------------------- --------------------------------------- ---------- ------ -- -- -- ------------- ------- -- -- - ---------- ------ ---- ------ ------ -- - ------------ ------------- ---------- ---- -- - --------------------- --------------------------- ------------------------------------ ------ -- -- -- ---------------- ----------- -- -- - ---------- ------ - ------ ------ -- - ------------ -------------------- ---------- ---- -- - --------------------- --------------------------- ---------------------------------------- ---------- ------ -- -- -- -- ----- ---- -------- --展开代码
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6591cc21eb4cecbf2d6cf4a3