使用 Chai 进行 JavaScript 测试:更好的断言

· 约 5 分钟读完

使用 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 的使用

  1. 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/);

  1. should 断言风格

should 断言的优点在于不需要像 expect 链式调用,而且可以将断言的结果储存在变量中,这样就可以动态计算结果,使得代码更灵活。

语法格式:

actual.should.be.XXX;

举例:

// should 断言 const count = 3; count.should.be.equal(3);

  1. 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 详解可以参考官方文档。

  1. 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),常用断言方法。
  1. should 断言
  • should.exist(x),判断 x 是否为 null、undefined ;
  • should.be.true/false/NaN,判断是否满足真、假、不是数字类型 ;
  • should.be.xxx(value),判断是否等于 value。
  1. 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