Angular单元测试

https://angular.github.io/protractor/#/

http://jasmine.github.io/2.4/introduction.html

测试程序有两种主要方法:端对端测试和单元测试。

端对端测试

如果使用自上而下的方法进行测试,那么写测试时就将程序视为一个“黑盒”。与程序交互就如真实用户一样,从“旁观者”的角度评判程序是否达标。这种自上而下的测试技巧被称为端对端测试。

在Angular中,最常用的工具叫作Protractor。Protractor能够打开浏览器与程序交互,收集测试结果,并检验测试结果与预期值是否相符。

单元测试

第二种常用的测试方法是隔离程序的每个部件,在隔离环境中运行测试。这种测试形式叫作单元测试。

在单元测试中,所写的测试需要事先提供既定的输入值与相应的逻辑单元,检测输出结果,确定它是否与我们的预期结果匹配。

--------------------------------------------------------------------------------

下面说说单元测试。

为了测试程序,我们将用到两种工具:Jasmine和Karma。

【Jasmine】

Jasmine是一种用于测试JavaScript代码的行为驱动框架。

利用Jasmine,你可以设置代码在调用后的预期结果。

比如,我们假定Calculator对象有一个sum函数。想确保1加1的结果为2,就可以用一个测试(也叫规格,spec)来表达。使用以下代码:

describe('Calculator', () => {

it('sums 1 and 1 to 2', () => {

var calc = new Calculator();

expect(calc.sum(1, 1)).toEqual(2);

});

});

使用Jasmine的一个优点是代码易于阅读。从以上代码可以看到,我们期望 calc.sum的结果等于2。

测试通常由多个describe块和it块组成。

通常,我们用describe来组织要测试的逻辑单元,对于其内部每个要使用断言的预期都会用到一个it块。然而,这并不是一个硬性规定。你会经常看到一个it块包含多个预期。

在上述Calculator示例中,我们只是列举了一个简单的对象。正因为如此,整个类只使用了一个describe块,而每个方法使用一个it块。

大多数情况下并非如此。比如,某些方法会根据不同输入值产生不同结果,那么这些方法可以拥有多个相应的it块。在这种情况下,最好使用嵌套的describe块:对象级别用一个,每个方法也各用一个,然后在其内部的每个断言语句用一个单独的it块包裹。

更多有关Jasmine和其语法的资料, 参见Jasmine 官方文档: http://jasmine.github.io/2.4/introduction.html。

【Karma】

使用Jasmine,我们可以描述测试和预期结果。要运行测试,还需要为测试提供一个浏览器环境。

Karma应运而生。使用Karma,我们可以在Chrome或Firefox之类的真实浏览器或者PhantomJS这样的空壳浏览器(无用户界面)内运行JavaScript代码。

--------------------------------------------------------------------------------

【Angular 单元测试框架】

Angular自身提供了一套基于Jasmine框架的辅助类,用以帮助我们编写单元测试。

主要的测试框架位于 @angular/core/testing 包中。(然而,为了测试组件,我们会用到 @angular/compiler/testing 包和 @angular/platform-browser/testing 包中的一些辅助类。稍后具体介绍。)

注:如果这是你初次测试Angular程序,那么在为Angular写单元测试时,需要先完成一些必要的设置步骤。

例如,在需要注入依赖时,我们经常手动配置它们。在测试一个组件时,需要使用测试辅助类初始化它们。在测试路由时,还需要构建一些依赖。

设置有些繁琐,但不用太担心。一旦掌握,你就会发现从一个项目切换到另外一个项目,配置不会有多大变化。