JavaScript 单元测试框架:Jasmine 初探(2)常见用法
 
- UID
- 1066743
|

JavaScript 单元测试框架:Jasmine 初探(2)常见用法
常见用法Matchers 每个 Matchers 实现一个布尔值,在实际值和期望值之间比较。它负责通知 Jasmine,此 expectation 是真或者假。然后 Jasmine 会认为相应的 spec 是通过还是失败。
任何 Matcher 可以在调用此 Matcher 之前用 not 的 expect 调用,计算负值的判断。
清单 4.测试用例1
2
3
4
5
6
7
8
| describe("The 'toBe' matcher compares with ===", function() {
it("and has a positive case ", function() {
expect(true).toBe(true);
});
it("and can have a negative case", function() {
expect(false).not.toBe(true);
});
});
|
Included Matchers Jasmine 有很多的 Matchers 集合。下面的例子中举例说明一些常用的 Matchers。另外当项目需要特定的判断,而没有包含在 Jasmine 的 Matchers 时,也可以通过写定制的 Matchers 来实现.
清单 5.测试用例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| describe("Included matchers:", function() {
it("The 'toBe' Matcher", function() {
var a = 3.6;
var b = a;
expect(a).toBe(b);
expect(a).not.toBe(null);
});
describe("The 'toEqual' matcher", function() {
it("works for simple literals and variables", function() {
var a = "varA";
expect(a).toEqual("varA");
});
it("Work for objects", function() {
var obj = {
a: 1,
b: 4
};
var obj2 = {
a: 1,
b: 4
};
expect(obj).toEqual(obj2);
});
});
it("The 'toBeDefined' matcher ", function() {
var obj = {
defined: 'defined'
};
expect(obj.defined).toBeDefined();
expect(obj.undefined).not.toBeDefined();
});
});
|
其他的 Matchers 还有:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| toBe()
toNotBe()
toBeDefined()
toBeUndefined()
toBeNull()
toBeTruthy()
toBeFalsy()
toBeLessThan()
toBeGreaterThan()
toEqual()
toNotEqual()
toContain()
toBeCloseTo()
toHaveBeenCalled()
toHaveBeenCalledWith()
toMatch()
toNotMatch()
toThrow()
|
Setup and Teardown 为了使某个测试用例干净的重复 setup 和 teardown 代码, Jasmine 提供了全局的 beforeEach 和 afterEach 方法。正像其名字一样,beforeEach 方法在 describe 中的
每个 Spec 执行之前运行,afterEach 在每个 Spec 调用后运行。
这里的在同一 Spec 集合中的例子有些不同。测试中的变量被定义为全局的 describe 代码块中,用来初始化的代码被挪到 beforeEach 方法中。afterEach 方法在继续前重置这些变量。
清单 6.测试用例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| describe("An example of setup and teardown)", function() {
var gVar;
beforeEach(function() {
gVar = 3.6;
gVar += 1;
});
afterEach(function() {
gVar = 0;
});
it("after setup, gVar has new value.", function() {
expect(gVar).toEqual(4.6);
});
it("A spec contains 2 expectations.", function() {
gVar = 0;
expect(gVar).toEqual(0);
expect(true).toEqual(true);
});
});
|
嵌套代码块 describe 可以嵌套, Specs 可以定义在任何一层。这样就可以让一个 suite 由一组树状的方法组成。在每个 spec 执行前,Jasmine 遍历树结构,按顺序执行每个 beforeEach 方法。Spec 执行后,Jasmine 同样执行相应的 afterEach。
清单 7.测试用例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| describe("A spec", function() {
var gVar;
beforeEach(function() {
gVar = 3.6;
gVar += 1;
});
afterEach(function() {
gVar = 0;
});
it("after setup, gVar has new value.", function() {
expect(gVar).toEqual(4.6);
});
it("A spec contains 2 expectations.", function() {
gVar = 0;
expect(gVar).toEqual(0);
expect(true).toEqual(true);
});
describe("nested describe", function() {
var tempVar;
beforeEach(function() {
tempVar = 4.6;
});
it("gVar is global scope, tempVar is this describe scope.", function() {
expect(gVar).toEqual(tempVar);
});
});
});
|
跳过测试代码块 Suites 和 Specs 分别可以用 xdescribe 和 xit 方法来禁用。运行时,这些 Suites 和 Specs 会被跳过,也不会在结果中出现。这可以方便的在项目中可以根据需要来禁用隐藏某些测试用例。
清单 8.测试用例1
2
3
4
5
6
7
8
9
10
11
12
| xdescribe("An example of xdescribe.", function() {
var gVar;
beforeEach(function() {
gVar = 3.6;
gVar += 1;
});
xit(" and xit", function() {
expect(gVar).toEqual(4.6);
});
});
|
以上代码可以在附件中的 List.html 运行,结果见下图:
图 2.测试用例结果 |
|
|
|
|
|