ngx-bootstrap — не удается разрешить все параметры для BsModalService в модульных тестах

Я использую ModalService ngx-bootstrap (3.0.1), чтобы показать модальный диалог, содержащий компонент

this.modalRef = this.modalService.show(MyDialogComponent);

и у меня есть это в моем модульном тесте (запущено шуткой)

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [MyComponent, MyDialogComponent],
    schemas: [CUSTOM_ELEMENTS_SCHEMA],
    providers: [MyService],
    imports: [
      ModalModule.forRoot(),
    ],
  })
  .compileComponents();
}));

Упрямая ошибка сообщает мне Не удается разрешить все параметры для BsModalService: (?, ?). Ответы, которые я смог найти, упоминали об отсутствии надлежащего декоратора @Injectable(), но это, очевидно, не поддается моему контролю. и к тому же все это неактуально и вводит в заблуждение — декоратор присутствует в исходниках ngx-bootstrap.

Я пытался явно предоставить все компоненты и сервисы из пакета (а не ModuleWithProviders, но и это не помогло.

Не хватает идей.

Обновление 1

Пробовал комментировать туда и обратно

import 'core-js/es7/reflect';

в plyfills.ts. Кажется, это не имеет значения. Если нет параметра конфигурации Jest, связанного с тем, что мне не хватает?


person user776686    schedule 05.11.2018    source источник
comment
Вам помог мой ответ?   -  person Lucho    schedule 06.11.2018
comment
К сожалению, нет. В итоге я отказался от диалога Bs и написал собственное легкое решение, основанное на хранилище ngrx, больше никаких ненадежных сервисов.   -  person user776686    schedule 07.11.2018
comment
Это странно, даже когда я предоставил рабочее решение на stackblitz. Ах, хорошо, может быть, это может противоречить настройке вашего приложения.   -  person Lucho    schedule 07.11.2018


Ответы (2)


попробуйте импортировать core-js/es7/reflect в ваш polyfills.ts, это необходимо для того, чтобы ваш тест работал

import 'core-js/es7/reflect';
person Fateh Mohamed    schedule 05.11.2018
comment
Вы имеете в виду в /src/polyfills.ts? Он был включен cli по умолчанию. - person user776686; 05.11.2018

Поскольку служба BsModalService динамически заполняет DOM (entryComponents), вы можете использовать BrowserDynamicTestingModule. API, добавив в configureTestingModule:

beforeEach(async(() => {
TestBed.configureTestingModule({
    imports: [ ModalModule.forRoot() ],
    declarations: [ MyDialogComponent ],
}).overrideModule(BrowserDynamicTestingModule, {
  set: {
    entryComponents: [ HelloComponent ],
  }
}).compileComponents();

}));

запускать элементы шаблона (например, кнопку) с отправкой API, а затем просто проверьте, появляется ли он в DOM.

вот stackblitz с живым примером.

ПРИМЕЧАНИЕ. Как ngx BsModalService заполняет DOM как родственный корневому узлу angular. Я не смог использовать Angular API для выбора модального элемента, поэтому вместо этого мне пришлось использовать DOM querySelector. Если у кого-то есть лучший способ, пожалуйста, прокомментируйте, чтобы я мог обновить

person Lucho    schedule 05.11.2018