Javascript 测试框架 Jasmine(二):Matchers
2014-06-19 · 899 chars · 5 min read
上一篇稍微介绍了一下,这一篇讲讲 Matcher。在 Jasmine 中,每个 Matcher 实现一个“期望值”和“实际值”的布尔判断,Jasmine 会根据 Mather 判断 expectation 是true
还是false
,然后决定 spec 是测试通过还是失败。所有 Matcher 可以通过not
执行否定判断。例如:
it('not示例', function () { expect(false).not.toBe(true) })
Jasmine 提供了丰富的内置 Matchers,下面简单讲一下:
toBe
#
toBe Matcher 用来执行===
对比:
it('toBe Matcher用来执行===对比', function () { var a = 12 var b = a expect(a).toBe(b) expect(a).not.toBe(null) })
toEqual
#
判断两个对象是否相等,可以对比简单的值类型的变量和对象:
describe('toEqual判断两个对象是否相等:', function () { it('对比简单的值类型的变量', function () { var a = 12 expect(a).toEqual(12) }) it('对比对象', function () { var foo = { a: 12, b: 34, } var bar = { a: 12, b: 34, } expect(foo).toEqual(bar) }) })
toMatch
#
使用正则匹配:
it('toMatch用来进行正则匹配', function () { var message = 'foo bar baz' expect(message).toMatch(/bar/) expect(message).toMatch('bar') expect(message).not.toMatch(/quux/) })
toBeDefined
#
判断是否非undefined:
it('toBeDefined判断是否非undefined', function () { var a = { foo: 'foo', } expect(a.foo).toBeDefined() expect(a.bar).not.toBeDefined() })
toBeUndefined
#
判断是否是 undefined:
it('toBeUndefined判断是否是undefined', function () { var a = { foo: 'foo', } expect(a.foo).not.toBeUndefined() expect(a.bar).toBeUndefined() })
toBeNull
#
判断是否为 null:
it('toBeNull用来判断是否为null', function () { var a = null var foo = 'foo' expect(null).toBeNull() expect(a).toBeNull() expect(foo).not.toBeNull() })
toBeTruthy
#
布尔测试,判断值是否是,或者可以转换为 true:
it('toBeTruthy执行布尔测试,判断值是否是,或者可以转换为true', function () { var a, foo = 'foo' expect(foo).toBeTruthy() expect(a).not.toBeTruthy() })
toBeFalsy
#
布尔测试,于 toBeTruthy 相反:
it('toBeFalsy和toBeTruthy相反', function () { var a, foo = 'foo' expect(a).toBeFalsy() expect(foo).not.toBeFalsy() })
toContain
#
判断一个数组是否包含某个值:
it('toContain判断一个数组是否包含某个值', function () { var a = ['foo', 'bar', 'baz'] expect(a).toContain('bar') expect(a).not.toContain('quux') })
toBeLessThan
#
数字大小比较:
it('toBeLessThan执行数字大小比较', function () { var pi = 3.1415926, e = 2.78 expect(e).toBeLessThan(pi) expect(pi).not.toBeLessThan(e) })
toBeGreaterThan
#
和 toBeLessThan 相反:
it('toBeGreaterThan和toBeLessThan相反', function () { var pi = 3.1415926, e = 2.78 expect(pi).toBeGreaterThan(e) expect(e).not.toBeGreaterThan(pi) })
toBeCloseTo
#
前面都作用一目了然,这个就有一点点不还理解了,还是想看例子:
it('toBeCloseTo示例', 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 }
这下就比较清晰了,toBeCloseTo
是比较两个值是否足够接近(不一定要相等),而这个“足够接近”就是toBeCloseTo
的第二个参数指定的,它表示小数点后位数除以 2(Math.pow(10, -precision) / 2
)。
toThrow
#
判断一个函数是否有抛出异常:
it('toThrow判断一个函数是否有抛出异常', function () { var foo = function () { return 1 + 2 } var bar = function () { return a + 1 //a不存在 } expect(foo).not.toThrow() expect(bar).toThrow() })
– 下一篇讲一下 Setup、Teardown、嵌套 describe、禁用 Suites,Specs 等 –