diff --git a/_tests/lib/matchers.dart b/_tests/lib/matchers.dart index 9072a21ca8..ec9a4cb111 100644 --- a/_tests/lib/matchers.dart +++ b/_tests/lib/matchers.dart @@ -1,20 +1,7 @@ import 'dart:html'; -import 'package:angular/src/di/errors.dart'; -import 'package:angular/src/facade/lang.dart'; import 'package:test/test.dart'; -/// Matches a missing provider error thrown at runtime. -final Matcher throwsMissingProviderError = (() { - if (assertionsEnabled()) { - return _throwsMissingProviderError; - } - return throwsArgumentError; -})(); - -final _isMissingProviderError = const isInstanceOf(); -final _throwsMissingProviderError = throwsA(_isMissingProviderError); - /// Matches textual content of an element including children. Matcher hasTextContent(expected) => new _HasTextContent(expected); diff --git a/_tests/test/di/injector_test.dart b/_tests/test/di/injector_test.dart index 58f7ceb5dd..f973575fab 100644 --- a/_tests/test/di/injector_test.dart +++ b/_tests/test/di/injector_test.dart @@ -6,7 +6,6 @@ import 'package:angular/src/di/injector/injector.dart'; import 'package:test/test.dart'; import 'package:angular/src/di/reflector.dart' as reflector; import 'package:angular_test/angular_test.dart'; -import 'package:_tests/matchers.dart'; import 'injector_test.template.dart' as ng; @@ -44,26 +43,11 @@ void main() { test('should throw by default', () { i = new Injector.empty(); - expect( - () => i.get(ExampleService), - throwsMissingProviderError, - ); - expect( - () => i.inject(ExampleService), - throwsMissingProviderError, - ); - expect( - () => i.injectFromSelf(ExampleService), - throwsMissingProviderError, - ); - expect( - () => i.injectFromAncestry(ExampleService), - throwsMissingProviderError, - ); - expect( - () => i.injectFromParent(ExampleService), - throwsMissingProviderError, - ); + expect(() => i.get(ExampleService), throwsArgumentError); + expect(() => i.inject(ExampleService), throwsArgumentError); + expect(() => i.injectFromSelf(ExampleService), throwsArgumentError); + expect(() => i.injectFromAncestry(ExampleService), throwsArgumentError); + expect(() => i.injectFromParent(ExampleService), throwsArgumentError); }); test('should use orElse if provided', () { @@ -80,10 +64,7 @@ void main() { i = new Injector.empty(parent); expect(i.get(ExampleService), 123); expect(i.inject(ExampleService), 123); - expect( - () => i.injectFromSelf(ExampleService), - throwsMissingProviderError, - ); + expect(() => i.injectFromSelf(ExampleService), throwsArgumentError); expect(i.injectFromAncestry(ExampleService), 123); expect(i.injectFromParent(ExampleService), 123); }); @@ -102,14 +83,8 @@ void main() { expect(i.get(ExampleService), 123); expect(i.inject(ExampleService), 123); expect(i.injectFromSelf(ExampleService), 123); - expect( - () => i.injectFromAncestry(ExampleService), - throwsMissingProviderError, - ); - expect( - () => i.injectFromParent(ExampleService), - throwsMissingProviderError, - ); + expect(() => i.injectFromAncestry(ExampleService), throwsArgumentError); + expect(() => i.injectFromParent(ExampleService), throwsArgumentError); }); test('should return itself if Injector is passed', () { @@ -218,10 +193,7 @@ void main() { test('should thrown when a provider was not found', () { i = new Injector.slowReflective([]); - expect( - () => i.get(#ABC), - throwsMissingProviderError, - ); + expect(() => i.get(#ABC), throwsArgumentError); }); test('should support resolveAndCreateChild', () { diff --git a/_tests/test/di/missing_provider_test.dart b/_tests/test/di/missing_provider_test.dart deleted file mode 100644 index 37c14dfe28..0000000000 --- a/_tests/test/di/missing_provider_test.dart +++ /dev/null @@ -1,36 +0,0 @@ -@TestOn('browser') -import 'package:angular/angular.dart'; -import 'package:angular/src/di/injector/injector.dart'; -import 'package:test/test.dart'; - -import 'missing_provider_test.template.dart' as ng; - -void main() { - ng.initReflector(); - - test('should throw an error for a single missing token', () { - final nullInjector = const Injector.empty(); - expect( - () => nullInjector.get(A), - throwsA(predicate((e) => '$e'.contains('No provider found for $A'))), - ); - }); - - test('should throw a better error for a path of missing tokens', () { - final injectorWithAB = new Injector.slowReflective([A]); - expect( - () => injectorWithAB.get(A), - throwsA( - predicate((e) => '$e'.contains('No provider found for $B: $A -> $B')), - ), - ); - }, skip: 'Not yet supported: We need to track the provider chain.'); -} - -@Injectable() -class A { - A(B b); -} - -@Injectable() -class B {} diff --git a/_tests/test/regression/755_reflective_meta_fail_test.dart b/_tests/test/regression/755_reflective_meta_fail_test.dart index e7cf35f607..10030f8c13 100644 --- a/_tests/test/regression/755_reflective_meta_fail_test.dart +++ b/_tests/test/regression/755_reflective_meta_fail_test.dart @@ -2,7 +2,6 @@ @TestOn('browser') import 'package:test/test.dart'; -import 'package:_tests/matchers.dart'; import 'package:angular/angular.dart'; import '755_reflective_meta_fail_test.template.dart' as ng_generated; @@ -16,10 +15,10 @@ void main() { const Provider(ServiceInjectingToken, useClass: ServiceInjectingToken), // Intentionally omit a binding for "stringToken". ]); - expect( - () => injector.get(ServiceInjectingToken), - throwsMissingProviderError, - ); + + // Used to return an Object representing the secret "notFound" instead of + // throwing ArgumentError, which was the expected behavior. + expect(() => injector.get(ServiceInjectingToken), throwsArgumentError); }); } diff --git a/angular/lib/src/di/errors.dart b/angular/lib/src/di/errors.dart deleted file mode 100644 index 577194ea2d..0000000000 --- a/angular/lib/src/di/errors.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:angular/src/facade/lang.dart'; - -import 'injector/injector.dart'; - -/// A list representing tokens not found in development mode. -/// -/// In production mode, this is always `null`, and should be ignored. -List devModeTokensNotResolvable; - -/// An error thrown when a token is not found when using an [Injector]. -/// -/// **NOTE**: This error is only guaranteed to be thrown in development mode -/// (i.e. when `assert` is enabled). Otherwise a generic error is thrown with -/// less information (but better performance and lower code-size). -class MissingProviderError extends Error { - /// Creates an error representing a miss on [token] looked up on [injector]. - static Error create(Injector injector, Object token) { - if (assertionsEnabled()) { - _findMissingTokenPath(injector, token); - return new MissingProviderError._(devModeTokensNotResolvable); - } - return new ArgumentError('No provider found for $token.'); - } - - static void _findMissingTokenPath(Injector injector, Object token) { - // TODO(matanl): Actually implement the rest of the missing path. - // i.e. Leaf -> Parent -> Root, not just Leaf. - devModeTokensNotResolvable = [token]; - } - - /// A list of tokens that was attempted, in order, that resulted in an error. - /// - /// For example: `[Leaf, Parent, Root]`, where `Root` was the root service - /// that was missing, looked up via a dependency on `Parent`, which was a - /// dependency of `Leaf`, the actual token requested via `get(Leaf)`. - final List tokens; - - MissingProviderError._(this.tokens); - - @override - String toString() => - // Example: No provider found for Leaf: Leaf -> Parent -> Root. - tokens.length == 1 - ? 'No provider found for ${tokens.first}' - : 'No provider found for ${tokens.first}: ' + tokens.join(' -> '); -} diff --git a/angular/lib/src/di/injector/injector.dart b/angular/lib/src/di/injector/injector.dart index 3cfef1bc9c..63eceb086e 100644 --- a/angular/lib/src/di/injector/injector.dart +++ b/angular/lib/src/di/injector/injector.dart @@ -1,7 +1,5 @@ import 'package:meta/meta.dart'; -import '../errors.dart'; - import 'empty.dart'; import 'hierarchical.dart'; import 'map.dart'; @@ -19,10 +17,8 @@ typedef T OrElseInject(Injector injector, Object token); /// **INTERNAL ONLY**: Sentinel value for determining a missing DI instance. const Object throwIfNotFound = const Object(); -/// **INTERNAL ONLY**: Throws an error that [token] was not found. -@alwaysThrows Null throwsNotFound(Injector injector, Object token) { - throw MissingProviderError.create(injector, token); + throw new ArgumentError('No provider found for $token.'); } /// Support for imperatively loading dependency injected services at runtime.