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