Angular 8 Testing - NullInjectorError: Нет поставщика для InjectionToken appBaseHref - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу проверить свою библиотеку.Он потребляет InjectionToken APP_BASE_HREF, но когда я начинаю свой тест, я получаю эту NullInjectorError.

Так как Injector.get() устарела, мне пришлось использовать 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();
  });
});

Когда я настраиваю свой TestBed, он вызывает метод, который обеспечивает APP_BASE_HREF, так почему я не получаю провайдера?

Редактировать Я пытался указать APP_BASE_HREF внутри beforEach, та же ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...