单元测试

前端单元测试的主要框架有 MochaJasmine,断言库有 shouldchaiexpect 以及node自带的 assert。这里主要讲解 Mocha 框架和 chai 断言。

Mocha 框架

  • describe('name', fn) 定义一组测试
  • it('name', fn) 定义一项测试
// 定义一组测试
describe('test-1', function() {
    // 定义第一项测试
    it('test-1-1', function() {
        //do something...
    }
    // 定义第二项测试
    it('test-1-2', function() {
        //do something...
    }
})

钩子函数

  • before:在该区块的所有测试用例之前执行
  • after:在该区块的所有测试用例之后执行
  • beforeEach:在每个单元测试(即it)执行前执行
  • afterEach:在每个单元测试(即it)执行后执行

异步测试

  • done函数
    Mocha 规定默认异步函数执行最大时间为2000ms,如果超时则报错,可以通过设置 -timeout 指定超时时长。
describe('test', function() {
    it('done test', function(done) {
        setTimeout(()=> {
            // do something...
            done()
        }, 3000)
    }).timeout(4000)  // 设置超时时长
})
  • Promise函数
    it 测试项直接返回一个 Promise 的时候,测试会等待 Promise 执行完之后再判断该测试是否通过。当promise执行 resolve 后,测试通过;执行 reject 或者都不执行的时候,测试不通过。
describe('异步测试', function() {
    it('Promise test', function() {
        new Promise((resolve, reject)=> {
            resolve()
        })
    })
})

done 方法可接收一个 Error 对象,只要 done 方法有传递参数,Mocha就会视为测试不通过。

chai.js 断言库

  • to
  • be
  • been
  • is
  • that
  • which
  • and
  • has
  • have
  • with
  • at
  • of
  • same
    上面部分api没有任何意义,只是为了提高可读性。

  • not:去之后的断言相反
expect(1).to.not.equal(2); 
  • deep:深度递归比较对象的值
expect({a: {num: 1}}).to.deep.equal({a: {num: 1}})
  • any:在keys断言前使用,包含任意一个或多个
expect({name: 'chai'}).to.any.keys('name', 'age')
  • all:在keys断言前使用,包含全部
expect({name: 'chai', age: '1'}).to.all.keys('name', 'age')
  • a/an:判断值的类型
expect(1).to.a('number')
  • include/contains:既可以判断对象的属性,也可以判断数组或字符串是否包含
expect({name: 'chai', age: 1}).to.include('name')
expect([1,2,3]).to.include(2)
  • ok:判断是否为真值
expect('123').to.be.ok
expect(false).to.not.be.ok
  • true/false:判断目标的值,与.ok的区别是它们不会进行类型转换,只能为true/false
expect(2>1).to.be.true
expect(1>2).to.be.false
  • null/undefined/NaN:判断目标是否等于 null/undefined/NaN
expect(null).to.be.null
expect(undefined).to.be.undefined
expect('chai').to.be.NaN
  • exist:判断目标是否存在,既非 null 也非 undefined
expect(null).to.not.exist
expect('a').to.exist
  • empty:判断对象是否为空,或者数组、字符串长度为0
expect([]).to.empty
expect({}).to.empty
  • equal:判断是否严格等于(===)
expect(1).to.equal(1)
  • eql:相当于.deep.equal
expect({name: 'chai'}).to.eql({name: 'chai')
  • above:大于
  • least:大于或等于
  • below:小于
  • most:小于或等于
expect(10).to.above(5)
expect(10).to.least(10)
expect(10).to.below(15)
expect(10).to.most(10)
  • within(number, number):设置上下限
expect(10).to.within(10, 20)
  • property(key, value):判断是否包含该属性,value 为可选,如果为数组,第一个值为index,第二个值为value
expect({name: 'chai'}).to.property('name')
expect({name: 'chai'}).to.property('name', 'chai')
expect([1, 2, 3, 4]).to.property('[1]', 2)
  • ownProperty:自身是否包含的属性
expect([]).to.ownProperty('length')
  • length:长度是否相等
expect([1, 2, 3]).length(3)
  • match:匹配正则表达式
expect('chai.js').to.match(/chai/)
  • string:是否包含另外一个字符串
expect('chai.js').string('chai')
  • keys:目标包含的属性,可与.any.all 等配合使用
expect({name: 'chai', age: 1}).to.any.keys('name')
  • closeTo(number, range):设置前后误差范围
expect(1.5),to.closeTo(1, 1)
  • members:是否包含该数组(是该数组的超集,type:Array)
expect([1, 2, 3]).to.members([2, 3])
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 你是否曾经尝试过谢盖代码后,导致其它地方出现问题吗? 我相信很多人都遇到过。因为这是几乎不可避免的,特别在庞大的代...
    Simon王小白阅读 940评论 0 3
  • Mocha测试框架和项目实例 测试项目已上传github 地址:https://github.com/Hanxue...
    视觉派Pie阅读 1,497评论 0 1
  • 单元测试概念 为什么要做单元测试 提供描述组件行为的文档 节省手动测试的时间 减少研发新特性时产生的 bug 改进...
    tobbyvic阅读 10,053评论 0 5
  • 在团队合作中,你写好了一个函数,供队友使用,跑去跟你的队友说,你传个A值进去,他就会返回B结果了。过了一会,你队友...
    JC_Huang阅读 5,294评论 1 29
  • 我也时常告诉自己的孩子:玩耍就在学习。 玩耍在社会性动物中尤其常见,这些动物的童年期都相对较长,父母投入较多,它们...
    笔舒轻风阅读 448评论 0 0