基于Jasmine 的 Javascript 测试 -- 第五章
发布在基于Jasmine的Javascript测试2013年10月13日view:3281
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

第五章 更多的Jasmine特性


Jasmine拥有许多有用的特性,将帮助你编写更加高级的测试。

Before 和 After

另一个Jasmine中有用的特性严格意义上来说是买一送一的两张票:beforeEach 和 afterEach。它们允许你执行一些代码--正如你所猜测的--在每个spec之前或者之后。这对于我们在测试结束之后分解出主要代码和清扫变量非常有帮助。

为了在每个spec之前执行一些代码,只需简单地将代码放入beforeEach中。但是要注意把变量置于合适的作用域以便使它们能够贯穿每个spec:

    describe("employee", function() {
      var employee;    // Note the scoping of this variable.
      beforeEach(function() {
          employee = new Employee;
             });
      it("has a name", function() {
          expect(employee.name).toBeDefined();
             });
      it("has a role", function() {
          expect(employee.role).toBeDefined();
               });
      });

类似的,如果你想要在每个spec之后执行一些代码,只需要将代码放入afterEach中。我是用afterEach的次数少于使用beforeEach的次数,但是当你需要清理代码的时候这将非常有帮助,例如:

 describe("Calculator", function() {
      var calculator = new Calculator;
      afterEach(function() {
          calculator.reset();
     });
      it("can add two positive integers", function() {
          expect(calculator.add(5, 12)).toEqual(17);
      });
      it("can add two negative integers", function() {
          expect(calculator.add(-5, -12)).toEqual(-17);
        }); 
   });

嵌套组件

当你的代码变得越来越复杂,你可能需要将你的代码组织进入群组,子群组甚至子子群组等等。Jasmine使用嵌套组件以及嵌套specs使这一切都变得简单。

像下面一样将一个describe放入另一个describe中:

 describe("chat", function() {
      describe("buddy list", function() {
          it("contains a list of users", function() {
              expect(chat.buddyList instanceof Array).toBeTruthy();
              expect(chat.buddyList[0] instanceof chat.User).toBeTruthy();
           }); 
    });
      describe("messages object", function() {
          it("contains a sender and a body", function() {
              var message = new chat.Message;
              expect(message.body).toEqual("");
              expect(message.sender instanceof chat.User).toBeTruthy();
             });
       });
  });

我以自己的实际例子为你描述这个组件的实际用途:在我最近的项目中有一个组包含了20个子群组,每个子群组又包含了5个子子群组。Jasmine确实让组件嵌套变得非常容易。

跳过Specs和组件

当你在编写specs代码时,有时你可能想跳过其中一些。或许这个spec还没完成;或者它运行的太慢;或者只是因为你不想在一堆绿色的spec的看到一个红的。

你不需要将specs注释掉,而只需要在之前加入一个字母x,然后代码就会好像你已经把这个spec注释掉了一样运行。在下面的例子中,我破门还没完成一个用来测试双彩虹亮度的spec,因此我们将它“x”掉:

 describe("double rainbow", function() {
      it("is all the way across the sky", function() {
          // 这个spec将会运行
       });
      xit("is so bright", function() {
          // 因为我们将这个spec “x”掉了,因此它不会运行
      });
 });

现在当你运行specs时,你将完全看不到“双彩虹是如此明亮”这个spec。

你也可以将整个组件“x”掉,这样将完全跳过其中的所有specs。在这个例子中,没有一个莱昂那多 迪卡普里奥的specs将会运行:

 xdescribe("Leonardo DiCaprio", function() {
      it("is not named after Leonardo da Vinci", function() {
          expect("Leonardo DiCaprio").not.toEqual("Leonardo da Vinci");
      });
      it("is in the movie Inception", function() {
          expect(Inception.cast).toContain("Leonardo DiCaprio");
      });
      it("is not in the movie Braveheart", function() {
          expect(Bravehart.cast).not.toContain("Leonardo DiCaprio");
         });
   });

一个spec都不会运行,可怜的小卡。

因为你的所有specs和组件都以函数的形式定义,你可以通过在函数中某个特定点之后加上return来达到跳过的效果。因为return终止了函数的执行,你可以在执行过程中终止一些函数的执行,比如下面这样:

   describe("I'm only going to run SOME of these", function() {
    it("will run this spec", function() {});
    it("will run this spec", function() {});
    return;  //这将终止该函数的执行
    it("will not run this spec", function() {});
    it("will not run this spec", function() {});
  });

这并不是Jasmine的特性,而是一个源于Javascript中的小技巧。对于不熟悉Javascript的开发者来说可能会有些小疑惑,因此我建议你在所有不运行的specs之后都加上一些注释。

匹配类名称

有时你并关心值是多少:你只关心类型是什么。为了说明这点,需要使用jasmine.any函数。这个函数有点类似Javascript中的 instanceof操作符,尽管在对待原始类型上存在些许不同。

让我们假设我们创造了一个叫做rand的函数用来产生一个随机数字。我们只是想确保无论什么情况下,它都返回一个数字。我们并不关心数字的值是什么,我们只关心它是不是一个数字:

  expect(rand()).toEqual(jasmine.any(Number));

当然,这并不是只对数字类型有用。所有以下的specs都将运行成功:

   expect("Hello world").toEqual(jasmine.any(String));
   expect({}).toEqual(jasmine.any(Object));
   expect(new MyObject).toEqual(jasmine.any(MyObject));

在你想要你的结果返回一个特定类型而不关心具体值是什么时,这个函数非常有用。


本系列文章译自Javascript testing with Jasmine,2013年3月由O’Reilly 出版社出版。

翻译文章需要花费大量时间和精力。如果您觉得本文对自己有帮助,请点击下面链接为我提供一些赞助。您的赞助是我继续前进的动力。

评论
发表评论
暂无评论
WRITTEN BY
张小俊128
Intern in Baidu mobile search department。认真工作,努力钻研,期待未来更多可能。
TA的新浪微博
PUBLISHED IN
基于Jasmine的Javascript测试

本系列文章译自Javascript testing with Jasmine,2013年3月由O’Reilly 出版社出版。

我的收藏