aboutsummaryrefslogtreecommitdiffstats
path: root/test/InjectorSpec.js
diff options
context:
space:
mode:
authorMisko Hevery2010-10-08 17:30:13 -0700
committerMisko Hevery2010-10-12 16:33:06 -0700
commitd9abfe8a7e488be8725f56077527b16f7c79546a (patch)
tree67089c5d2059e7a56afab0fec19dbce76fdab798 /test/InjectorSpec.js
parentfbfd160316de1b99e7afa4102c7fae2ee5b9c1f5 (diff)
downloadangular.js-d9abfe8a7e488be8725f56077527b16f7c79546a.tar.bz2
Introduced injector and $new to scope, and injection into link methods and controllers
- added angular.injector(scope, services, instanceCache) which returns inject - inject method can return, instance, or call function which have $inject property - initialize services with $creation=[eager|eager-publish] this means that only some of the services are now globally accessible - upgraded $become on scope to use injector hence respect the $inject property for injection - $become should not be run multiple times and will most likely be removed in future version - added $new on scope to create a child scope - $inject is respected on constructor function - simplified scopes so that they no longer have separate __proto__ for parent, api, behavior and instance this should speed up execution since scope will now create one __proto__ chain per scope (not three). BACKWARD COMPATIBILITY WARNING: - services now need to have $inject instead of inject property for proper injection this breaks backward compatibility - not all services are now published into root scope (only: $location, $cookie, $window) - if you have widget/directive which uses services on scope (such as this.$xhr), you will now have to inject that service in (as it is not published on the root scope anymore)
Diffstat (limited to 'test/InjectorSpec.js')
-rw-r--r--test/InjectorSpec.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/InjectorSpec.js b/test/InjectorSpec.js
new file mode 100644
index 00000000..ba0f27f7
--- /dev/null
+++ b/test/InjectorSpec.js
@@ -0,0 +1,71 @@
+describe('injector', function(){
+ var providers;
+ var cache;
+ var inject;
+ var scope;
+
+ beforeEach(function(){
+ providers = extensionMap({}, 'providers');
+ cache = {};
+ scope = {};
+ inject = createInjector(scope, providers, cache);
+ });
+
+ it("should return same instance from calling provider", function(){
+ providers('text', function(){ return scope.name; });
+ scope.name = 'abc';
+ expect(inject('text')).toEqual('abc');
+ expect(cache.text).toEqual('abc');
+ scope.name = 'deleted';
+ expect(inject('text')).toEqual('abc');
+ });
+
+ it("should return an array of instances", function(){
+ cache.a = 0;
+ providers('b', function(){return 2;});
+ expect(inject(['a', 'b'])).toEqual([0,2]);
+ });
+
+ it("should call function", function(){
+ providers('a', function(){return 1;});
+ providers('b', function(){return 2;});
+ var args;
+ function fn(a, b, c, d) {
+ args = [this, a, b, c, d];
+ }
+ fn.$inject = ['a', 'b'];
+ inject(fn, {name:"this"}, 3, 4);
+ expect(args).toEqual([{name:'this'}, 1, 2, 3, 4]);
+ });
+
+ it('should inject providers', function(){
+ providers('a', function(){return this.mi = 'Mi';});
+ providers('b', function(mi){return this.name = mi+'sko';}, {$inject:['a']});
+ expect(inject('b')).toEqual('Misko');
+ expect(scope).toEqual({mi:'Mi', name:'Misko'});
+ });
+
+ it('should provide usefull message if no provider', function(){
+ assertThrows("Unknown provider for 'idontexist'.", function(){
+ inject('idontexist');
+ });
+ });
+
+ it('should autostart eager services', function(){
+ var log = '';
+ providers('eager', function(){log += 'eager;';}, {$creation: 'eager'});
+ inject();
+ expect(log).toEqual('eager;');
+ expect(scope.eager).not.toBeDefined();
+ });
+
+
+ it('should return a list of published objects', function(){
+ var log = '';
+ providers('eager', function(){log += 'eager;'; return 'pub'; }, {$creation: 'eager-published'});
+ inject();
+ expect(log).toEqual('eager;');
+ expect(scope.eager).toEqual('pub');
+
+ });
+}); \ No newline at end of file