Javascript测试框架Jasmine(三):Setup、Teardown、嵌套describe等

zz from: http://keenwon.com/1206.html


上一篇把Matcher说了说,本来该说自定义Matcher的,但是发现有些七七八八的细节没讲,那就今天先把这些基础说了。

Setup and Teardown

Setup和Teardown可以帮助Suite执行一些重复的代码,Jasmine提供了beforeEach 和afterEach 函数。很显然,beforeEach 在describe中的任何spec执行之前运行,afterEach在任何spec执行之后运行。具体的逻辑看Demo就一目了然了:

 
 
  1. describe("Setup和Teardown示例", function() {
  2. var foo;
  3.  
  4. beforeEach(function() {
  5. foo = 0;
  6. foo += 1;
  7. });
  8.  
  9. afterEach(function() {
  10. foo = 0;
  11. });
  12.  
  13. it("测试1", function() {
  14. expect(foo).toEqual(1);
  15. });
  16.  
  17. it("测试2", function() {
  18. expect(foo).toEqual(1);
  19. expect(true).toEqual(true);
  20. });
  21. });

在线演示

前面说过javascript的作用域规则在Jasmine中是适用的,但是这里可以通过this 在beforeEachit ,afterEach 中间共享变量。每个spec的this 默认指向空的object。

 
 
  1. describe("this用法示例", function() {
  2. beforeEach(function() {
  3. this.foo = 0;
  4. });
  5.  
  6. it("使用this共享状态", function() {
  7. expect(this.foo).toEqual(0);
  8. this.bar = "test pollution?";
  9. });
  10.  
  11. it("下个Spec执行前this会被重置为空Object", function() {
  12. expect(this.foo).toEqual(0);
  13. expect(this.bar).toBe(undefined);
  14. });
  15. });

在线演示

嵌套describe

可以嵌套使用describe,形成一个Suite树,在一个spec执行之前,Jasmine会顺序执行这颗树上的所有beforeEach 。同样的,执行完spec后,也会顺序执行树上的所有afterEach

 
 
  1. describe("测试嵌套describe:level1", function() {
  2. var foo;
  3.  
  4. beforeEach(function() {
  5. alert('level1:Setup');
  6. });
  7.  
  8. afterEach(function() {
  9. alert('level1:Teardown');
  10. });
  11.  
  12. it("level1:测试", function() {
  13. alert('level1:测试');
  14. });
  15.  
  16. describe("测试嵌套describe:level2", function() {
  17. beforeEach(function() {
  18. alert('level2:Setup');
  19. });
  20.  
  21. afterEach(function() {
  22. alert('level2:Teardown');
  23. });
  24.  
  25. it("level2:测试", function() {
  26. alert('level2:测试');
  27. });
  28. });
  29. });

具体的执行顺序,点击这里查看上例的效果,你就全明白了。

禁用Suites和挂起Specs

可以使用xdescribe 和xit 函数禁用Suites和specs。当Suites被禁用后,将不显示在报表中。

 
 
  1. xdescribe("A spec", function() {
  2. var foo;
  3.  
  4. beforeEach(function() {
  5. foo = 0;
  6. foo += 1;
  7. });
  8.  
  9. it("is just a function, so it can contain any code", function() {
  10. expect(foo).toEqual(1);
  11. });
  12. });

另外可以使用pending 函数将specs挂起,挂起specs和使用xit 函数定义的spec一样,spec不会被执行,但是名字会出现在报表中。另外只有名字,没有实际代码的spec也会在结果中显示为挂起的状态。pending 可以在spec函数体的任何地方调用,不管函数体内有没有expectations,还是看个例子:

 
 
  1. describe("Pending specs", function() {
  2. xit("can be declared 'xit'", function() {
  3. expect(true).toBe(false);
  4. });
  5.  
  6. it("can be declared with 'it' but without a function");
  7.  
  8. it("can be declared by calling 'pending' in the spec body", function() {
  9. expect(true).toBe(false);
  10. pending();
  11. });
  12. });

jasmine.any

jasmine.any 接受构造函数或者“Class”名作为期望值,如果这个构造函数(Class)和实际值的构造函数(Class)匹配,则返回true 。继续看例子:

 
 
  1. describe("jasmine.any", function() {
  2. it("matches any value", function() {
  3. expect({}).toEqual(jasmine.any(Object));
  4. expect(12).toEqual(jasmine.any(Number));
  5. });
  6.  
  7. describe("when used with a spy", function() {
  8. it("is useful for comparing arguments", function() {
  9. var foo = jasmine.createSpy('foo');
  10. foo(12, function() {
  11. return true;
  12. });
  13.  
  14. expect(foo).toHaveBeenCalledWith(jasmine.any(Number), jasmine.any(Function));
  15. });
  16. });
  17. });

jasmine.objectContaining

当一个你只关心实际值是否包含某个键值对的时候,可以使用jasmine.objectContaining

 
 
  1. describe("jasmine.objectContaining", function() {
  2. var foo;
  3.  
  4. beforeEach(function() {
  5. foo = {
  6. a: 1,
  7. b: 2,
  8. bar: "baz"
  9. };
  10. });
  11.  
  12. it("matches objects with the expect key/value pairs", function() {
  13. expect(foo).toEqual(jasmine.objectContaining({
  14. bar: "baz"
  15. }));
  16. expect(foo).not.toEqual(jasmine.objectContaining({
  17. c: 37
  18. }));
  19. });
  20.  
  21. describe("when used with a spy", function() {
  22. it("is useful for comparing arguments", function() {
  23. var callback = jasmine.createSpy('callback');
  24.  
  25. callback({
  26. bar: "baz"
  27. });
  28.  
  29. expect(callback).toHaveBeenCalledWith(jasmine.objectContaining({
  30. bar: "baz"
  31. }));
  32. expect(callback).not.toHaveBeenCalledWith(jasmine.objectContaining({
  33. c: 37
  34. }));
  35. });
  36. });
  37. });


– 下一篇讲一下自定义Matcher –


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值