使用 Chai 进行 JavaScript 测试:更好的断言
前言
JavaScript 是一门动态的、解释型语言,而 JavaScript 的错误很难被编译器发现。好的测试能够保证代码的质量,提高程序的稳定性、可读性和可维护性。
JavaScript 作为前端工程师的主力语言,测试就显得尤为重要。Mocha 和 Jest 测试框架等优秀的测试框架可以让我们愉快地编写测试用例,但是断言库毕竟是测试的”核心“,相较于单元测试框架,断言库是测试的灵魂;因为它们提供了我们测试是否正确的判断方法。
Chai 是一个测试断言库,它可以与其他测试框架(比如 Mocha 和 Jest)很好的配合,提供了 BDD、TDD 和 Assert 等多种风格,具有易读的语法,使用简单,极大地提高了测试的可读性和可维护性。
本文将介绍 Chai 的使用方法,包括安装、配置、API 详解和示例代码。
一、安装及配置
安装方式:
npm install chai
引入方式:
// BDD 风格引入 const { expect, should, assert } = require("chai");
// TDD 风格引入 const assert = require("chai").assert;
// Expect.js 风格引入 const expect = require("chai").expect;
注意,我们可以根据自己的应用场景选择不同的引入方式。
二、Chai 的使用
- expect 断言风格
expect 链式调用,让我们的测试用例简单易懂,具有很高的可读性。
语法格式:
expect(actual).to.be.XXX;
举例:
// 判断 val 是否等于 10 const val = 10; expect(val).to.be.equal(10);
// 判断 str 是否满足正则式 const str = 'chai test'; expect(str).to.match(/^chai/);
- should 断言风格
should 断言的优点在于不需要像 expect 链式调用,而且可以将断言的结果储存在变量中,这样就可以动态计算结果,使得代码更灵活。
语法格式:
actual.should.be.XXX;
举例:
// should 断言 const count = 3; count.should.be.equal(3);
- assert 断言风格
assert 断言风格的语法简洁,最适合开发者优先级最高的单元测试。
语法格式:
assert.xxx(actual[, msg]);
举例:
// 判断 diff 是否小于 0 const a = 10; const b = 20; const diff = b - a; assert.isBelow(diff, 0, 'diff must less than zero');
三、API 详解
这里简单介绍几个常用的 API,更多 API 详解可以参考官方文档。
- expect 断言
- expect(obj).to.be.a('XXX'),判断 obj 是否属于 XXX 类型;
- expect(obj).to.be.instanceof(xxx),判断 obj 是否是 xxx 的实例;
- expect(obj).to.have.property(key, value),判断 obj 是否含有 key 属性,属性值等于 value ;
- expect(obj).to.be.equal/eq/above/below/gte/lte(x)、expect(obj).to.match/contain(xxxx),常用断言方法。
- should 断言
- should.exist(x),判断 x 是否为 null、undefined ;
- should.be.true/false/NaN,判断是否满足真、假、不是数字类型 ;
- should.be.xxx(value),判断是否等于 value。
- assert 断言
- assert.xxx(actual[, msg]),assert 链式调用和正确/错误提示。
四、示例代码
使用 Chai 测试一个简单的工具函数,判断来自一个字符串的组成是否全部为数字。
// 引入 expect 断言风格 const { expect } = require("chai");
// 工具函数 function isAllDigit(str) { if (typeof str !== 'string') { return false; } const valArr = str.split('') return valArr.every((value) => !isNaN(parseFloat(value))); }
// 测试用例,使用 expect 断言风格 describe("工具函数:isAllDigit", function() { it("empty string input", function() { expect(isAllDigit('')).to.equal(false); // expect + to.equal() 语法 }); it("all digit char input", function() { const testVal = '990023'; expect(isAllDigit(testVal)).is.true; // expect + is. 语法 }); it("digit and char mixed input", function() { const testVal = '1234D'; // expect + to.match() 语法 expect(isAllDigit(testVal)).to.match(/^([0-9])+$/); }); })
结语
测试是编写代码不可或缺的一部分,良好的测试能够让我们更自信地修改代码,完善系统并提高代码质量。Chai 断言库可以让我们的测试用例易于编写、易于读取、易于维护,熟练掌握 Chai,可以让我们更加高效、自信的进行单元测试。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6b436a941bf7134c8c184