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,我们可以校验一个请求的产生,对响应打桩、基于远程服务器的响应