Page 282 - AngularJS权威教程
P. 282

262  第 19 章  测试


                    // 并且模拟真实的响应
                    spyOn(googleApi, 'gapi')
                      .andCallFake(function() {
                        var d = q.defer(); // 模拟deferred函数
                        setTimeout(function() {
                          resolvedValue = {
                            clientId: '12345'
                          }
                        }, 100);
                        return d.promise;
                      });
                      // 使用真正函数的resolve
                      // 来设置解析之后的值
                      googleApi.gapi().then(function(keys) {
                        resolvedValue = keys;
                      });
                  }));
                 现在,可以用我们的间谍来判断函数是否确实被调用了。

                 在这个describe()块中的第一个测试只是简单地测试了这个方法存在,并且是一个函数。
             如果我们还在用这个API,并且改变了方法名或者签名,这个测试就会很有用。

                 我们用Jasmine帮助函数waitsFor()建立测试来等待一个promise的解析。该函数带有单个参
             数:一个函数,对于方法什么时候可以继续,提供了值为true或者false的响应。我们把它设置
             为最多等待.5秒:
                 describe('googleApi', function() {
                   beforeEach(function() {
                     // 当我们等待
                     // resolvedValue被解析的时候
                     // 暂停本细则半秒
                     waitsFor(function() {
                       return resolvedValue !== undefined;
                     }, 500);
                   });

                   it('should have a gapi function', function() {
                     expect(
                       typeof(googleApi.gapi)
                     ).toEqual('function');
                   });
                 现在我们可以为服务的返回值设置预期,并且断言它们等同于我们的设想:
                 it('should call gapi', function() {
                   expect(googleApi.gapi.callCount)
                     .toEqual(1);
                 });

                 it('should resolve with the browser keys', function() {
                   expect(resolvedValue.clientId)
                     .toBeDefined();
                 });

                 2. 端到端测试服务
                 既然服务是通过控制器与前端交互的,通过端到端测试来专门测试服务就不是很有效了。然
             而,我们也可以测试:服务解析了它们的promise,并且就是这些结果填充了视图。
   277   278   279   280   281   282   283   284   285   286   287