在上一节中,我们讲解了测试运行器,我们将用它来运行AngularJS写的单元测试。但本书实现这个目标的测试框架实际上是Jasmine。Jasmine 框架使用所谓的行为驱动风格编写测试。
也就是说不用写一大堆功能和断言,我们描述行为并设定预期。这是如何转化为实际测试的呢?让我们更深入了解一下。
Jasmine 语法
之前我们跳过 Jasmine 语法而谈论各种 Jasmine 测试概念,让我们用一个例子来更加清楚地认识:
// 一个简单的Jasmine测试套件
describe('My Function', function() {
var t;
// 类似新建
beforeEach(function() {
t = true;
});
afterEach(function() {
t = null;
});
it('should perform action 1', function() {
expect(t).toBeTruthy();
});
it('should perform action 2', function() {
var expectedValue = true;
expect(t).toEqual(expectedValue);
});
});
让我们逐段分析这个例子:
- describe
我们的测试的第一行创建一个测试套件。您可以把它看作多个单元测试的容器,为控制器、服务等编写描述。如果您想要描述控制器复杂函数,可以在描述中嵌套描述,
- beforeEach
beforeEach
类似于 xUnit
测试模式下设置功能。也就是说,传递给 beforeEach
的函数将在每单独的it块之前执行。在本实例中,t = true
该行将在描述中每个 it
块之前执行一次。还可以在描述中有多个 beforeEach
函数,每个函数会按声明顺序执行一次。
- afterEach
类似于 beforeEach
, afterEach
块在单独的it块完成后再执行。如果你使用模拟库,这是最好检查任何模拟预期是否满意的地方。
- it
此处放置单元测试。每个it块应是完备并独立于其他 it
块的。在`
`it块中,基本上都会设置状态、执行函数,检查它的返回值,确保满足所有预期。
- expect
相当于 Jasmine 断言语句,您可以使用一个内置的匹配器(或创建自己的)来检查每个预期值。在前面的示例中,我们使用 Jasmine 匹配器 toBeTruthy
,它的值应该匹配JavaScript真值(null,非空的字符串,非零数字,或布尔真的)。第二个 it
块,我们使用了 toEqual
匹配器,需要另一个值与第一个值比较看是否相等。
有用的Jasmine匹配器
让我们快速浏览一些基本内置的在测试中常用的Jasmine匹配器。它们都同 expect
一起使用。那就是expect(value).myMatcherHere
:
- toEqual
最基本的 Jasmine 匹配器,toEqual
需要第二个值并对两个对象作深度相等检查。如果是对象所有的字段必须匹配。如果是数组,数组的所有元素必须匹配。
- toBe
toBe匹配器检查参考,预期传给预期的项和匹配器有完全相同的对象引用。
- toBeTruthy
检查传递到匹配器的值是否是JavaScript真值。非null对象,非空的字符串、非零数字、所有布尔true都看作JavaScript真值。
- toBeFalsy
检查传递到匹配器的值是否是JavaScript假值。Null值、未定义的变量、空字符串、零,所有布尔 false
都看作JavaScript假值。
- toBeDefined
确保传递到预期的引用否定义(分配一个参考值)过的。
- toBeUndefined
检查传递到预期的引用用否未定义或未设置。
- toBeNull
检查传递到预期的引用是否 null
。
- toContain
检查传递到预期的数组是否包含传递给匹配器的元素。
- toMatch
用于正则表达式检查预期时,第一个参数是一个字符串需要匹配一个特定的正则表达式规则。
在这本书中我们将使用这些匹配器中的一些或所有。 当然,Jasmine 是可扩展的,它允许您编写自己的自定义匹配器。你可以阅读Jasmine 匹配器页面了解更多。
评论 (0)