如何使用Chai库expect语法实现等价assert的真假值测试逻辑
Chai expect 等价实现方案
你原有代码的核心逻辑可以拆成两个断言规则:
- 异步函数
asyncFunction()执行时必须抛出异常,若函数正常执行完成无报错,直接判定测试失败 - 函数抛出的异常对象必须为真值,不能是
null/undefined这类假值
推荐写法(搭配chai-as-promised插件)
这是Chai生态中处理异步Promise断言的标准方案,代码最简洁,逻辑和你原有实现100%对齐:
const { expect } = require('chai'); const chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); // 测试逻辑核心代码 await expect(asyncFunction()).to.be.rejected;
这段代码的执行逻辑和你写的原生assert完全一致:
- 会等待
asyncFunction()返回的Promise状态变更,如果Promise正常resolve(没抛错),直接触发断言失败,对应你原来try块里的assert(false)分支 - 如果Promise按预期reject抛出错误,会自动校验reject传递的错误值为真值,对应你
catch块里的assert(err)分支
无插件原生Chai写法
如果不想引入额外插件,可以用标记位的方式完全复刻原有逻辑,避免断言错误被catch块误捕获:
const { expect } = require('chai'); let hasError = false; let caughtError = null; try { await asyncFunction(); // 预期抛出错误 } catch (err) { hasError = true; caughtError = err; } // 函数没抛错就强制失败,对应原assert(false) expect(hasError).to.be.true; // 校验错误为真值,对应原catch块的assert(err) expect(caughtError).to.be.ok;
如果你想保留和原来几乎一致的try/catch结构,也可以用expect.fail,注意要过滤掉自身抛出的断言错误,避免误判:
const { expect } = require('chai'); try { await asyncFunction(); // 预期抛出错误 // 走到这里说明没抛错,直接触发失败 expect.fail('Expected function to throw an error'); } catch (err) { // 过滤掉expect.fail抛出的断言错误,重新抛出让测试框架识别失败 if (err.message === 'Expected function to throw an error') throw err; // 校验捕获到的业务错误为真值 expect(err).to.be.ok; }
内容的提问来源于stack exchange,提问作者Dzianis Czaplia
相关产品推荐
相关产品推荐

