From 197cf09689fbb798a9866a26d676b1acb895b67d Mon Sep 17 00:00:00 2001 From: vsavkin Date: Wed, 16 Dec 2015 12:25:03 -0800 Subject: [PATCH] feat(core): improve NoAnnotationError message Closes #4866 Closes #5927 --- modules/angular2/src/core/di/exceptions.ts | 6 ++++-- modules/angular2/test/core/di/injector_spec.ts | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/modules/angular2/src/core/di/exceptions.ts b/modules/angular2/src/core/di/exceptions.ts index 6e18ccf36b..084b1a32dd 100644 --- a/modules/angular2/src/core/di/exceptions.ts +++ b/modules/angular2/src/core/di/exceptions.ts @@ -222,8 +222,10 @@ export class NoAnnotationError extends BaseException { signature.push(parameter.map(stringify).join(' ')); } } - return "Cannot resolve all parameters for " + stringify(typeOrFunc) + "(" + - signature.join(', ') + "). " + 'Make sure they all have valid type or annotations.'; + return "Cannot resolve all parameters for '" + stringify(typeOrFunc) + "'(" + + signature.join(', ') + "). " + + "Make sure that all the parameters are decorated with Inject or have valid type annotations and that '" + + stringify(typeOrFunc) + "' is decorated with Injectable."; } } diff --git a/modules/angular2/test/core/di/injector_spec.ts b/modules/angular2/test/core/di/injector_spec.ts index eed196dfe9..41bc809708 100644 --- a/modules/angular2/test/core/di/injector_spec.ts +++ b/modules/angular2/test/core/di/injector_spec.ts @@ -88,6 +88,8 @@ class NoAnnotations { constructor(secretDependency) {} } +function factoryFn(a) {} + export function main() { var dynamicProviders = [ provide('provider0', {useValue: 1}), @@ -142,10 +144,20 @@ export function main() { expect(car.engine).toBeAnInstanceOf(TurboEngine); }); - it('should throw when no type and not @Inject', () => { + it('should throw when no type and not @Inject (class case)', () => { expect(() => createInjector([NoAnnotations])) - .toThrowError('Cannot resolve all parameters for NoAnnotations(?). ' + - 'Make sure they all have valid type or annotations.'); + .toThrowError( + "Cannot resolve all parameters for 'NoAnnotations'(?). " + + 'Make sure that all the parameters are decorated with Inject or have valid type annotations ' + + "and that 'NoAnnotations' is decorated with Injectable."); + }); + + it('should throw when no type and not @Inject (factory case)', () => { + expect(() => createInjector([provide("someToken", {useFactory: factoryFn})])) + .toThrowError( + "Cannot resolve all parameters for 'factoryFn'(?). " + + 'Make sure that all the parameters are decorated with Inject or have valid type annotations ' + + "and that 'factoryFn' is decorated with Injectable."); }); it('should cache instances', () => {