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,并且就是这些结果填充了视图。