diff --git a/README.md b/README.md index c37e6054..dc44bee9 100644 --- a/README.md +++ b/README.md @@ -866,6 +866,9 @@ To access the provider, get it from the component injector using the `fromCompon spectator.get(FooService, true) ``` +The same rules also apply to directives using the `directiveProviders` and `directiveMocks` parameters. + + ## Custom Matchers ```ts expect('.zippy__content').not.toExist(); diff --git a/projects/spectator/src/lib/spectator-directive/create-factory.ts b/projects/spectator/src/lib/spectator-directive/create-factory.ts index e5771769..038e3ca5 100644 --- a/projects/spectator/src/lib/spectator-directive/create-factory.ts +++ b/projects/spectator/src/lib/spectator-directive/create-factory.ts @@ -29,6 +29,7 @@ export interface SpectatorDirectiveOverrides extends BaseSpectatorOver detectChanges?: boolean; props?: Partial; hostProps?: HostComponent extends H ? HP : Partial; + directiveProviders?: Provider[]; } /** @@ -49,7 +50,12 @@ export function createDirectiveFactory( })); return (template: string, overrides?: SpectatorDirectiveOverrides) => { - const defaults: SpectatorDirectiveOverrides = { props: {}, hostProps: {} as any, detectChanges: true, providers: [] }; + const defaults: SpectatorDirectiveOverrides = { + props: {}, + hostProps: {} as any, + detectChanges: true, + providers: [] + }; const { detectChanges, props, hostProps, providers } = { ...defaults, ...overrides }; if (providers && providers.length) { @@ -66,6 +72,12 @@ export function createDirectiveFactory( set: { template } }); + if (options.directiveProviders.length || options.directiveMocks.length) { + TestBed.overrideDirective(options.directive, { + set: { providers: [...options.directiveProviders, ...options.directiveMocks.map(p => options.mockProvider(p))] } + }); + } + const spectator = createSpectatorDirective(options, props, hostProps); if (options.detectChanges && detectChanges) { diff --git a/projects/spectator/src/lib/spectator-directive/options.ts b/projects/spectator/src/lib/spectator-directive/options.ts index 698ce775..dd6a7700 100644 --- a/projects/spectator/src/lib/spectator-directive/options.ts +++ b/projects/spectator/src/lib/spectator-directive/options.ts @@ -1,4 +1,4 @@ -import { Type } from '@angular/core'; +import { Type, Provider } from '@angular/core'; import { merge } from '../internals/merge'; import { OptionalsRequired } from '../types'; @@ -14,6 +14,8 @@ export interface SpectatorDirectiveOptions extends BaseSpectatorOptions { detectChanges?: boolean; host?: Type; template?: string; + directiveProviders?: Provider[]; + directiveMocks?: Type[]; } const defaultSpectatorRoutingOptions: OptionalsRequired> = { @@ -21,7 +23,9 @@ const defaultSpectatorRoutingOptions: OptionalsRequired { + let host: SpectatorDirective; + + const createHost = createDirectiveFactory({ + directive: DirectiveProviderDirective, + directiveProviders: [{ provide: directiveProviderToken, useValue: 'notTest' }], + directiveMocks: [FormBuilder] + }); + + it('should inject the provided value', () => { + host = createHost(`
Testing Directive Providers
`); + + expect(host.directive.provider).toEqual('notTest'); + }); +}); diff --git a/projects/spectator/test/directive-providers.directive.ts b/projects/spectator/test/directive-providers.directive.ts new file mode 100644 index 00000000..7934e1ee --- /dev/null +++ b/projects/spectator/test/directive-providers.directive.ts @@ -0,0 +1,12 @@ +import { Directive, Inject, InjectionToken } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; + +export const directiveProviderToken = new InjectionToken('DirectiveProviderToken'); + +@Directive({ + selector: '[directiveProvider]', + providers: [{ provide: directiveProviderToken, useValue: 'test' }] +}) +export class DirectiveProviderDirective { + constructor(@Inject(directiveProviderToken) public provider: string, private fb: FormBuilder) {} +}