Как ввести интерфейс зависимости в угловых 6 модульных тестах - PullRequest
0 голосов
/ 29 августа 2018

Одна из зависимостей службы внедряет интерфейс в конструктор. Интересно, как я могу зависимость вводит интерфейс в модульный тест?

Экспортируемый интерфейс:

export interface MobilePlatform {
  onClick(): void;
  onPageFinished(router: Router): void;
  onPageStart(): void;
  sendClose(): void;
  tts(text: String): void;
}

Сервис внедряет интерфейс в конструктор

constructor(private platform: MobilePlatform, private router: Router) {}

Как я могу ввести этот интерфейс в тесте углового модуля?

describe('MobileActions', () => {
  let actions: MobileActions;
  let platform: MobilePlatform;

  beforeEach(() => {

    TestBed.configureTestingModule({
      providers: [
        MobileActions,
        { provide: MobilePlatform, useClass: MockMobilePlatform },
        { provide: Router, useClass: MockRouter }
      ]
    });

    actions = TestBed.get(MobileActions);
    platform = TestBed.get(MockMobilePlatform);
  });

  it('should create actions', () => {
    expect(actions).toBeTruthy();
    expect(platform).toBeTruthy();
  });
});

Кажется, этот тип инъекции не удался.

1 Ответ

0 голосов
/ 29 августа 2018

Вы не можете, так как интерфейс - это контракт, который не переносится на фактическую функцию класса. Чтобы создать тестируемое представление такого интерфейса в угловом инжекторе, вам нужно будет создать типичный токен инъекции:

Где-то в вашем файле моделей MobilePlatform:

export const MOBILE_PLATFORM = new InjectionToken<MobilePlatform>('mobilePlatform');

Тогда в вашем сервисном конструкторе:

constructor( @Inject(MOBILE_PLATFORM) private platform: MobilePlatform, private router: Router ) {}

Наконец, в массиве providers вашего модуля тестирования:

{ provide: MOBILE_PLATFORM, useClass: MockMobilePlatform },

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