一个module可以列出它所依赖的其他module。依赖一个module,意味着被请求(required)的module(被依赖的)必须在进行请求(requiring)module(需要依赖其他module的module,请求方)加载之前加载完成。换一种说法,被请求的module的configuration block会在请求的module的configuration block执行前执行(before the configuration blocks or the requiring module,这里的or怎么解释呢?)。对于run block也是这个道理。每一个module只能够被加载一次,即使有多个其他module需要(require)它。
d) Asynchronous Loading(异步加载)
module是管理$injector配置的方法之一,不用对加载脚本到VM做任何事情。现在已经有现成的项目专门用于处理脚本加载,也可以用到angular中。因为module在加载的过程中不做任何事情,它们可以按照任意的顺序被加载到VM中。脚本加载器可以利用这个特性,进行并行加载。
五、Unit Testing(单元测试)
在单元测试的最简单的形式中,其中一个是在测试中实例化一个应用的子集,然后运行它们。重要的是,我们需要意识到对于每一个injector,每一个module只会被加载一次。通常一个应用只会有一个injector。但在测试中,每一个测试用例都有它的injector,这意味着在每一个VM中,module会被多次加载。正确地构建module,将对单元测试有帮助,正如下面的例子:
在这个例子中,我们准备假设定义如下的module:
angular.module('greetMod', []). factory('alert', function($window) { return function(text) { $window.alert(text); }; }) .value('salutation', 'Hello') .factory('greet', function(alert, salutation) { return function(name) { alert(salutation + ' ' + name + '!'); }; });
让我们写一些测试用例:
describe('myApp', function() { // 加载应用响应的module,然后加载指定的将$window重写为mock版本的测试module, // 这样做,当进行window.alert()时,测试器就不会因被真正的alert窗口阻挡而停止 //这里是一个在测试中覆盖配置信息的例子 beforeEach(module('greetMod', function($provide) {//这里看来是要将真正的$window替换为以下的东东 $provide.value('$window', { alert: jasmine.createSpy('alert') }); })); // inject()会创建一个injector,并且注入greet和$window到测试中。 // 测试不需要关心如何写应用,只需要关注如何测试应用。 it('should alert on $window', inject(function(greet, $window) { greet('World'); expect($window.alert).toHaveBeenCalledWith('Hello World!'); })); // 这里是在测试中通过行内module和inject方法来覆盖配置的方法 it('should alert using the alert service', function() { var alertSpy = jasmine.createSpy('alert'); module(function($provide) { $provide.value('alert', alertSpy); }); inject(function(greet) { greet('World'); expect(alertSpy).toHaveBeenCalledWith('Hello World!'); }); }); });
您可能感兴趣的文章: