UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

165 lines (164 loc) 5.42 kB
import { Injector, PLATFORM_INITIALIZER } from 'angular2/core'; import { BaseException } from 'angular2/src/facade/exceptions'; import { ListWrapper } from 'angular2/src/facade/collection'; import { FunctionWrapper, isPresent } from 'angular2/src/facade/lang'; export class TestInjector { constructor() { this._instantiated = false; this._injector = null; this._providers = []; this.platformProviders = []; this.applicationProviders = []; } reset() { this._injector = null; this._providers = []; this._instantiated = false; } addProviders(providers) { if (this._instantiated) { throw new BaseException('Cannot add providers after test injector is instantiated'); } this._providers = ListWrapper.concat(this._providers, providers); } createInjector() { var rootInjector = Injector.resolveAndCreate(this.platformProviders); this._injector = rootInjector.resolveAndCreateChild(ListWrapper.concat(this.applicationProviders, this._providers)); this._instantiated = true; return this._injector; } execute(fn) { var additionalProviders = fn.additionalProviders(); if (additionalProviders.length > 0) { this.addProviders(additionalProviders); } if (!this._instantiated) { this.createInjector(); } return fn.execute(this._injector); } } var _testInjector = null; export function getTestInjector() { if (_testInjector == null) { _testInjector = new TestInjector(); } return _testInjector; } /** * Set the providers that the test injector should use. These should be providers * common to every test in the suite. * * This may only be called once, to set up the common providers for the current test * suite on teh current platform. If you absolutely need to change the providers, * first use `resetBaseTestProviders`. * * Test Providers for individual platforms are available from * 'angular2/platform/testing/<platform_name>'. */ export function setBaseTestProviders(platformProviders, applicationProviders) { var testInjector = getTestInjector(); if (testInjector.platformProviders.length > 0 || testInjector.applicationProviders.length > 0) { throw new BaseException('Cannot set base providers because it has already been called'); } testInjector.platformProviders = platformProviders; testInjector.applicationProviders = applicationProviders; var injector = testInjector.createInjector(); let inits = injector.getOptional(PLATFORM_INITIALIZER); if (isPresent(inits)) { inits.forEach(init => init()); } testInjector.reset(); } /** * Reset the providers for the test injector. */ export function resetBaseTestProviders() { var testInjector = getTestInjector(); testInjector.platformProviders = []; testInjector.applicationProviders = []; testInjector.reset(); } /** * Allows injecting dependencies in `beforeEach()` and `it()`. * * Example: * * ``` * beforeEach(inject([Dependency, AClass], (dep, object) => { * // some code that uses `dep` and `object` * // ... * })); * * it('...', inject([AClass], (object) => { * object.doSomething(); * expect(...); * }) * ``` * * Notes: * - inject is currently a function because of some Traceur limitation the syntax should * eventually * becomes `it('...', @Inject (object: AClass, async: AsyncTestCompleter) => { ... });` * * @param {Array} tokens * @param {Function} fn * @return {FunctionWithParamTokens} */ export function inject(tokens, fn) { return new FunctionWithParamTokens(tokens, fn, false); } export class InjectSetupWrapper { constructor(_providers) { this._providers = _providers; } inject(tokens, fn) { return new FunctionWithParamTokens(tokens, fn, false, this._providers); } injectAsync(tokens, fn) { return new FunctionWithParamTokens(tokens, fn, true, this._providers); } } export function withProviders(providers) { return new InjectSetupWrapper(providers); } /** * Allows injecting dependencies in `beforeEach()` and `it()`. The test must return * a promise which will resolve when all asynchronous activity is complete. * * Example: * * ``` * it('...', injectAsync([AClass], (object) => { * return object.doSomething().then(() => { * expect(...); * }); * }) * ``` * * @param {Array} tokens * @param {Function} fn * @return {FunctionWithParamTokens} */ export function injectAsync(tokens, fn) { return new FunctionWithParamTokens(tokens, fn, true); } function emptyArray() { return []; } export class FunctionWithParamTokens { constructor(_tokens, _fn, isAsync, additionalProviders = emptyArray) { this._tokens = _tokens; this._fn = _fn; this.isAsync = isAsync; this.additionalProviders = additionalProviders; } /** * Returns the value of the executed function. */ execute(injector) { var params = this._tokens.map(t => injector.get(t)); return FunctionWrapper.apply(this._fn, params); } hasToken(token) { return this._tokens.indexOf(token) > -1; } }