Page 266 - AngularJS权威教程
P. 266

246  第 19 章  测试


                     注意,我们只要调用module就可以了,因为angular.mock.module函数被发布在全
                 局作用域的window接口上了。
                 建立了模拟的Angular模块之后,可以把连接到这个模块上的任意服务注入到我们测试代码里。

                 凭借这些测试,我们需要像Angular那样在运行时注入依赖关系。在我们的单元测试中,这
             一步是必要的,因为我们隔离了想要测试的功能。
                 要注入一个依赖,在beforeEach函数调用中使用angular.mock.inject方法,类似之前做的
             那样。

                 describe('myApp', function() {
                   var scope;

                   // 模拟我们的'myApp' angular模块
                   beforeEach(angular.mock.module('myApp'));
                   beforeEach(angular.mock.inject(function($rootScope) {
                     scope = $rootScope.$new();
                   });
                   it('...')
                 });

                     类似于module函数,inject函数也是在window对象上的,为的是全局访问,所以
                 也可以直接调用inject。
                 在这个测试中,就像在其他几乎所有单元测试中那样,我们想要保存当前工作对象实例的
             引用(在上面例子中,保存的是scope)。那样,我们可以在整个it()子句中对这个对象引用进
             行操作。

                 通常,我们会用将引用注入进测试时使用的名字来保存它。比如,如果我们在测试一个服务,
             可以注入这个服务,然后把它的引用用一种稍微不同的命名方案存储起来。我们想在注入的服务
             名称两端使用下划线,这样当它被注入时, 注入器会忽略它的名称。

                 describe('myApp', function() {
                   var myService;

                   // 模拟我们的'myApp'angular模块
                   beforeEach(module('myApp'));
                   beforeEach(inject(function(_myService_) {
                     myService = _myService_;
                   });
                   it('...')
                 });


             19.13 模拟$httpBackend


                 Angular也内置了$httpBackend模拟库,这样我们可以在应用中模拟任何外部的XHR请求,
             避免在测试中创建昂贵的$http请求。

                 $httpBackend服务是一个假的HTTP后端实现,能让我们隔离和指定外部服务器可能处于的
             条件,这样我们可以精确确定应用在不同条件下的行为。

                 使用$httpBackend,我们可以校验一个请求的产生,对响应打桩、基于远程服务器的响应
   261   262   263   264   265   266   267   268   269   270   271