背景
近来担任一个需求,运用到了jasmine测试框架做单元测试
引见
Jasmine就是一种JavaScript
单元测试框架,它不依靠任何其他JS框架,也不需要对DOM操纵,具有灵活而明白的语法能够让你轻松的编写测试代码。它是一套Javascript行动驱动开辟框架(BDD),清洁简约,表达力强且易于组织,不依靠于其他任何框架和DOM,可运转于Node.js
,浏览器端或挪动端。
Jasmine官网
Jasmine github
Jasmine的基本语法
Suites
Suites能够明白为一组测试,运用全局的Jasmin函数describe 建立。describe 函数接收两个参数,一个字符串和一个函数。字符串是这个Suites的名字或题目(一般形貌下测试内容),函数是完成Suites的代码块。Specs
Specs能够明白为一个测试,运用全局的Jasmin函数it 建立。和describe 一样接收两个参数,一个字符串和一个函数,函数就是要实行的测试,字符串就是测试的名字。一个Spec能够包括多个expectations来测试代码。在Jasmine中,一个expectations就是一个断言,只能是true 或false 。只需悉数expectations是true 的时刻spec才会经由过程。因为describe 和it 块实质上都函数,一切他能够包括任何的可实行代码。javascript的作用域划定规矩也是实用的,所以describe 内定义的变量,其内部一切的it 都能访问到。
Expectations
expectations由expect 函数建立。接收一个参数。和Matcher一同联用,设置测试的预期值。
Matchers
在Jasmine中,每一个Matcher完成一个“期望值”和“现实值”的布尔推断,Jasmine会依据Mather推断expectation是true 照样false ,然后决议spec是测试经由过程照样失利。一切Matcher能够经由过程not 实行否认推断。
基本matchers
toBe()
:相当于===比较。toNotBe()
toBeDefined()
:搜检变量或属性是不是已声明且赋值。toBeUndefined()
toBeNull()
:是不是是null。toBeTruthy()
:布尔测试,推断值是不是是,或许能够转换为true。toBeFalsy()
toBeLessThan()
:数值比较,小于。toBeGreaterThan()
:数值比较,大于。toEqual()
:相当于==,注重与toBe()的区分。一个新建的Object不是(not to be)另一个新建的Object,然则它们是相称(to equal)的。
expect({}).not().toBe({});
expect({}).toEqual({});
toNotEqual()
toContain()
:数组中是不是包括元素(值)。只能用于数组,不能用于对象。toBeCloseTo()
:是比较两个值是不是充足靠近(不一定要相称)。it("The 'toBeCloseTo' matcher is for precision math comparison", function() { var pi = 3.1415926, e = 2.78; expect(pi).not.toBeCloseTo(e, 2); expect(pi).toBeCloseTo(e, 0); });
看源码明白用法
getJasmineRequireObj().toBeCloseTo = function () { function toBeCloseTo() { return { compare: function (actual, expected, precision) { if (precision !== 0) { precision = precision || 2; } return { pass: Math.abs(expected - actual) < (Math.pow(10, -precision) / 2) }; } }; } return toBeCloseTo; };
比方第二个expect就是假如pi-e的绝对值小于10的-0次方除以2的值,断言经由过程
toMatch()
:按正则表达式婚配。toNotMatch()
toThrow()
:磨练一个函数是不是会抛出一个毛病it("toThrow推断一个函数是不是有抛出非常", function() { var foo = function() { return 1 + 2; }; var bar = function() { return a + 1; //a不存在 }; expect(foo).not.toThrow(); expect(bar).toThrow(); });
其他matchers
jasmine.any(Class)
传入组织函数或许类返回数据类型作为期望值,返回true示意现实值和期望值数据类型雷同:it("matches any value", function() { expect({}).toEqual(jasmine.any(Object)); expect(12).toEqual(jasmine.any(Number)); });
jasmine.anything()
假如现实值不是null或许undefined则返回true:it("matches anything", function() { expect(1).toEqual(jasmine.anything()); });
jasmine.objectContaining({key:value})
现实对象只需婚配到有对应的键/值就算婚配经由过程:foo = { a: 1, b: 2, bar: "baz" }; expect(foo).toEqual(jasmine.objectContaining({bar: "baz"}));
jasmine.arrayContaining([val1,val2,...])
现实数组只需婚配到有包括的数值就算婚配经由过程:foo = [1, 2, 3, 4]; expect(foo).toEqual(jasmine.arrayContaining([3, 1]));
jasmine.stringContaining(str)
stringContaining能够婚配字符串的一部分也能够婚配对象内的字符串:expect({foo: 'bar'}).toEqual({foo: jasmine.stringMatching(/^bar$/)}); expect('foobarbaz').toEqual({foo: jasmine.stringMatching('bar')});
Setup and Teardown
为了在庞杂的测试用例中越发便于组装和拆开,Jasmine供应了四个函数:
beforeEach(function)
//在每一个测试用例(it)实行之前都实行一遍beforeEach函数; afterEach(function)
//在每一个测试用例(it)实行完成以后都实行一遍afterEach函数; beforeAll(function)
//在一切测试用例实行之前实行一遍beforeAll函数; afterAll(function)
//在一切测试用例实行完成以后实行一遍afterAll函数;
jasmine另有自定义matcher的功用和一些高等功用,临时没有用到,有时机进修下