前言
Mocha 是一个JavaScript测试框架,常用于Node.js应用程序和浏览器。它让异步测试变得真正简单且有趣。chai 是一个适用于BDD / TDD的断言库。这篇文章将详细介绍如何使用chai库进行mocha测试。
安装
首先,你需要安装Mocha和Chai.
npm install mocha chai --save-dev
语法
Chai有两个接口能用于编写测试用例:assert和expect.
assert机制在使用上有点类似Node.js内建的assert机制,可以根据条件是否成立来抛出异常或者不同的输出信息。
expect机制是一种更加接近人类自然语言的断言方式,更加浅显易懂。
使用assert机制
assert机制,用于判断代码运行结果是否符合预期。assert的常用api如下所示。
equal(), notEqual()
equal()的两个参数如果比较结果不相等,直接报错;
notEqual()的两个参数如果比较结果相等,直接报错。
var assert = require('chai').assert; var foo = 'bar' assert.equal(foo, 'bar', 'foo equal `bar`'); assert.notEqual(foo, 'foo', 'foo not equal `foo`');
isTrue(), isFalse()
判断参数是否为true/false,用于判断布尔值和相等性
var assert = require('chai').assert; var isTrue = true assert.isTrue(isTrue); assert.isFalse(!isTrue);
throw()
该方法需要一个作为函数参数的函数,如果抛出错误就表示测试成功。
var assert = require('chai').assert; assert.throw(()=>{ throw new Error('error happend!'); }, Error)
typeOf()
判断变量的数据类型是否正确。
-- -------------------- ---- ------- --- ------ - ----------------------- --- ------ - -- --- ------ - ------ --- --- - -------- --- --- - --- -- -- ----- --- ---- - ----- --- -- - ------ ------------------ ------ -- --------------------- ---------- --------------------- ---------- ------------------ --------- ------------------ ---------- ------------------- ----------- ----------------- ------------
notTypeOf()
除了typeOf方法来判断变量的数据类型,还可以用notTypeOf进行补充。
-- -------------------- ---- ------- --- ------ - ----------------------- --- ------ - -- --- ------ - ------ --- --- - -------- --- --- - --- -- -- ----- --- ---- - ----- --- -- - ------ ------------------ ------ -- ------------------------ ---------- ------------------------ ---------- --------------------- ---------- --------------------- --------- ---------------------- ------------ -------------------- ---------
instanceOf()
检测变量是否是构造函数的实例。
-- -------------------- ---- ------- --- ------ - ----------------------- --- --- - --- -- -- ----- --- --- - -------- --- --- - ----- ----- --- ------------ ----------- - ---------------------- -------- ---------------------- ------- ---------------------- ----------
notInstanceOf()
补充instanceOf方法的不足。
-- -------------------- ---- ------- --- ------ - ----------------------- --- --- - --- -- -- ----- --- --- - -------- --- --- - ----- ----- --- ------------ ----------- - ------------------------- ------- ------------------------- ------- ------------------------- --------
使用expect机制
expect机制,是api接口简单易懂,使用自然语言描述测试目的以及是否通过。 从下面的例子里,可以感受到这种简单、直观的测试方式。
expect().to.equal()
检测两个变量是否相等。
var expect = require('chai').expect; var foo = 'bar' expect(foo).to.equal('bar');
expect().to.not.equal()
补充expect().to.equal()方法。
var expect = require('chai').expect; var foo = 'bar' expect(foo).to.not.equal('foo');
expect().to.be.a()
检测变量的数据类型。
-- -------------------- ---- ------- --- ------ - ----------------------- --- ------ - -- --- ------ - ------ --- --- - -------- --- --- - --- -- -- ----- --- ---- - ----- --- -- - ------ ------------------ ------ -- --------------------------------- --------------------------------- ----------------------------- ------------------------------ -------------------------------- -------------------------------
expect().to.not.be.a()
补充expect().to.be.a()方法的不足。
-- -------------------- ---- ------- --- ------ - ----------------------- --- ------ - -- --- ------ - ------ --- --- - -------- --- --- - --- -- -- ----- --- ---- - ----- --- -- - ------ ------------------ ------ -- ------------------------------------- ------------------------------------ ---------------------------------- --------------------------------- ------------------------------------- ---------------------------------
expect().to.include()
判断字符串或数组中是否包含特定的子字符串或元素。
var expect = require('chai').expect; var string = 'hello world'; var arr = [1,2,3,4,5]; expect(string).to.include('world'); expect(arr).to.include(3);
expect().to.not.include()
补充expect().to.include()方法。
var expect = require('chai').expect; var string = 'hello world'; var arr = [1,2,3,4,5]; expect(string).to.not.include('hello'); expect(arr).to.not.include(6);
expect().to.have.lengthOf()
检测字符串或数组长度是否符合预期。
var expect = require('chai').expect; var string = '123'; var arr = [1,2,3]; expect(string).to.have.lengthOf(3); expect(arr).to.have.lengthOf(3);
expect().to.not.have.lengthOf()
补充expect().to.have.lengthOf()方法。
var expect = require('chai').expect; var string = '12345'; var arr = [1,2,3]; expect(string).to.not.have.lengthOf(5); expect(arr).to.not.have.lengthOf(4);
expect().to.throw()
如果函数throw一个错误,则判断它是否符合预期。
var expect = require('chai').expect; expect(()=>{ throw new Error('error happend!'); }).to.throw(Error)
expect().to.not.throw()
补充expect().to.throw()方法。
var expect = require('chai').expect; var fn = (()=>{ console.log('hello chai') }) expect(fn).to.not.throw(Error)
Mocha测试实例
假设A+的写法如下
-- -------------------- ---- ------- -------- ----------- - --- ----- - ---------- --- ----- - ----- --- --------- - --- --------- - --------------------- - ------ --- ------------------------- - -------- ------------ ----------- -- ----- -------- ------- --- --- -- -------- ---------------- - -------- --- ---------- - ------------------------- ------- - --- --- - ---------------------------- ---------------------- - -------- ----------------- - ----------- -- ----------------- --- -------- -- ---------------- --- ------------ - --- ---- - -------------- --------- ---- --- ----------- - ------------------- --------- ------- - - ----- - --------- ----- - ------------ --------------------- - ------------------------------------ - ----------------- --- -- --- - ------------ -
针对Promise类进行测试代码如下
-- -------------------- ---- ------- --- ------ - ------------------ --- ------- - -------------------------- ------------------- ---------- - ------------------- ---------- - ---------- ------- ----- -- --- ---- ------ -------------- - --- ------- - --- ------------------------- - ----------------- --- ------- ------------------- - ----------------- --------- ------ ------- -- ------------------- - ----------------- --------- ------- --- --- ---------- ------- ----- -- ---- ---- -- ------ ------- -------- -------------- - --- ------- - --- ------------------------- - ----------------- --- ------- ------------------- - ----------------- --------- ------ --- ------------------------- - ----------- ------------------------- - ----------------- ---- -- -- ------------------- - ----------------- --------- ------- --- --- --- ---
结论
断言库让mocha测试变得更具生产力。chai库正如它的口号一样:“又快又简单”,用它可以让你不仅更加专注于测试本身,还有语法明确且易于阅读,填充了JS测试的空白,丰富了JS单元测试的处理方式。在进行mocha单元测试时,使用chai断言库能让我们静下心来,更好的将精力放到测试本身,减少因为简单的测试而浪费时间的现象。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6728a96f2e7021665e210bce