Page 281 - AngularJS权威教程
P. 281

19.14  测试一个应用    261


                        scriptTag.async = true;                                                      19
                        scriptTag.src =
                          'https://apis.google.com/js/client:plusone.js?onload=onLoadCallback';
                        var s = $document[0].getElementsByTagName('body')[0];
                        s.appendChild(scriptTag);                                                    20

                        // 返回一个单例对象
                        // 这个对象返回一个promise                                                           21
                        return {
                          gapi: function() { return d.promise; }
                        }
                    });                                                                              22
                  服务自身返回了一个对象,包含一个返回promise的函数。这个promise会在Google API被加
              载到页面上并准备好之后被解析一次。                                                                      23
                  要为这个服务建立预期,需要使用Jasmine的spyOn方法来在我们调用的方法上创建一个间
              谍,并且建立一个期望:它确实被调用了。                                                                    24

                  我们会在一个隔离的describe()块中建立对Google API的测试:
                                                                                                     25
                  describe('googleServices', function() {
                    var googleApi, resolvedValue;

                    beforeEach(inject(function($injector) {                                          26
                      // 从我们的服务中获取定义的googleApi
                      googleApi = $injector.get('googleApi');
                      // 为gapi函数创建一个间谍                                                               27
                      // 用于告诉我们它何时被调用
                      // 但不阻止真正的函数调用
                      spyOn(googleApi, 'gapi')                                                       28
                        .andCallThrough();
                      // 使用真正函数的resolve
                      // 来设置解析之后的值
                      googleApi.gapi().then(function(keys) {                                         29
                        resolvedValue = keys;
                      });
                    }));                                                                             30

                    describe('googleApi', function() {
                         // 我们的测试放在这里
                    });                                                                              31
                  });
                  我们也可以使用名称来注入上面的googleApi服务,因为inject()函数使用与$injector相                               32
              同的语法。上面的调用会变成inject(function(googleApi))。

                                                                                                     33
                          使用andCallThrough()方法,我们的测试就会等到gapi对象在window上就绪。
                         可以用一个不同的方法andCallFake()来给这些请求打桩。
                                                                                                     34
                  var q;
                   beforeEach(inject(function($injector) {
                     // 从服务中获取预定义的googleApi                                                          35
                     googleApi = $injector.get('googleApi');
                     // 取得$q对象
                     q = $injector.get('$q');
                     // 为gapi函数创建一个间谍                                                                36
   276   277   278   279   280   281   282   283   284   285   286