jeudi 19 septembre 2019

Angular 8 Testing - NullInjectorError: No provider for InjectionToken appBaseHref

I want to test my library. It consumes an InjectionToken APP_BASE_HREF, but when i start my test, i get this NullInjectorError.

Since Injector.get() is deprecated i had to use Injector.get<T>()

cookie-monster-provider.ts

import {CookieOptions} from './ngx-cookie-monster-options.model';
import {Inject, Injectable, InjectionToken, Injector, Type} from '@angular/core';
import {APP_BASE_HREF} from '@angular/common';
import {merge} from './ngx-cookie-monster-ext';

export const COOKIE_OPTIONS = new InjectionToken<CookieOptions>('COOKIE_OPTIONS');

@Injectable()
export class NgxCookieMonsterProvider {

  private defaultCookieOptions: CookieOptions;

  constructor(@Inject(COOKIE_OPTIONS) options: CookieOptions = {}, private _injector: Injector) {
    this.defaultCookieOptions = {
      path: this._injector.get<string>(APP_BASE_HREF + '/' as Type<string>),
      domain: null,
      expires: null,
      secure: false,
      httpOnly: false,
      sameSite: 'none'
    };

    this._cookieOptions = merge(this.defaultCookieOptions, options);
  }

  private _cookieOptions: CookieOptions;

  get cookieOptions(): CookieOptions {
    return this._cookieOptions;
  }
}

cookie-monster.module.ts

import {ModuleWithProviders, NgModule} from '@angular/core';
import {CookieOptions} from './ngx-cookie-monster-options.model';
import {COOKIE_OPTIONS, NgxCookieMonsterProvider} from './ngx-cookie-monster-provider';
import {NgxCookieMonsterService} from './ngx-cookie-monster.service';
import {ngxCookieMonsterFactory} from './ngx-cookie-monster-factory';
import {APP_BASE_HREF} from "@angular/common";

@NgModule({
  providers: [NgxCookieMonsterProvider]
})
export class CookieModule {
  /**
   * Use this method to provide the CookieService
   */
  static forRoot(options: CookieOptions = {}): ModuleWithProviders {
    return {
      ngModule: CookieModule,
      providers: [
        {provide: COOKIE_OPTIONS, useValue: options},
        {provide: NgxCookieMonsterService, useFactory: ngxCookieMonsterFactory, deps: [NgxCookieMonsterProvider]},
        {provide: APP_BASE_HREF, useValue: '/'}
      ]
    };
  }
}

cookie-monster.service.spec.ts

import {Injector} from '@angular/core';
import {getTestBed, TestBed} from '@angular/core/testing';

import {CookieModule} from '../lib';
import {NgxCookieMonsterService} from "./ngx-cookie-monster.service";

describe('NgxCookieMonsterService', () => {

  let injector: Injector;
  let cookieService: NgxCookieMonsterService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        CookieModule.forRoot({})
      ]
    });
    injector = getTestBed();
    cookieService = injector.get(NgxCookieMonsterService);
  });

  it('should be defined', () => {
    expect(NgxCookieMonsterService).toBeDefined();
    expect(cookieService).toBeDefined();
    expect(cookieService instanceof NgxCookieMonsterService).toBeTruthy();
  });
});


When i configure my TestBed it calls the method which provides APP_BASE_HREF, so why am i getting no provider?

Aucun commentaire:

Enregistrer un commentaire