fix($injector): instantiate returns instance, if non-object value returned from constructor

This commit is contained in:
Vojta Jina 2012-02-08 16:12:11 -08:00
parent 3173d8603d
commit 776739299b
2 changed files with 32 additions and 6 deletions

View file

@ -429,12 +429,15 @@ function createInjector(modulesToLoad) {
}
}
function instantiate(Type, locals){
var Constructor = function(){},
instance;
function instantiate(Type, locals) {
var Constructor = function() {},
instance, returnedValue;
Constructor.prototype = Type.prototype;
instance = new Constructor();
return invoke(Type, instance, locals) || instance;
returnedValue = invoke(Type, instance, locals);
return isObject(returnedValue) ? returnedValue : instance;
}
return {

View file

@ -606,8 +606,12 @@ describe('injector', function() {
it('should allow constructor to return different object', function() {
var t = $injector.instantiate(function() { return 'ABC'; });
expect(t).toBe('ABC');
var obj = {};
var Class = function() {
return obj;
};
expect($injector.instantiate(Class)).toBe(obj);
});
@ -616,6 +620,25 @@ describe('injector', function() {
$injector.instantiate(function() { throw 'MyError'; });
}).toThrow('MyError');
});
it('should return instance if constructor returns non-object value', function() {
var A = function() {
return 10;
};
var B = function() {
return 'some-string';
};
var C = function() {
return undefined;
};
expect($injector.instantiate(A) instanceof A).toBe(true);
expect($injector.instantiate(B) instanceof B).toBe(true);
expect($injector.instantiate(C) instanceof C).toBe(true);
});
});
describe('protection modes', function() {