Жасмин: обрабатывать Promise.resolve (). Затем внутри ngOnInit - PullRequest
0 голосов
/ 26 октября 2018

Когда мой угловой компонент загружен, он отображает модальный режим (ng-bootstrap).

В моем тесте я пытаюсь получить доступ к этому модалу, но не могу получить к нему доступ, так как он, кажется, загружается после выполнения моего теста.

component.ts

ngOnInit() {
    Promise.resolve().then(() => { // promise is needed because of angular bug: https://github.com/angular/angular/issues/15634
      this.ciamModal = this.modalService.open(this.ciamcheck, {ariaLabelledBy: "modal-basic-title", keyboard: false});
      this.ciamModal.result.then((result) => {
        // will be closed from code
      }, (reason) => {
        this.router.navigate(["/somewhere"]);
      });
    });
  }

component.spec.ts

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [AppModule, AdminModule, SharedModule],
    providers: [
      {provide: APP_BASE_HREF, useValue: "/"},
      { provide: LOCALE_ID, useValue: "de" }
    ]
  })
  .compileComponents();

  fixture = TestBed.createComponent(UserCreatorComponent);
  component = fixture.componentInstance;
});

it("should display ciam lookup dialog", async((done) => {
  fixture.whenStable().then(() => {
    fixture.detectChanges();
    expect(fixture.debugElement.query(By.css("#modal-basic-title")).nativeElement.innerHTML).toContain("E-Mail");
  });
  component.ngOnInit();
}));

при запуске теста я получаю следующее сообщение об ошибке:

TypeError: Cannot read property 'nativeElement' of null
        at eval (webpack:///./src/app/admin/user-creator/user-creator.component.spec.ts?:117:95)
        at ZoneDelegate.invoke (webpack:///./node_modules/zone.js/dist/zone.js?:387:26)
        at AsyncTestZoneSpec.onInvoke (webpack:///./node_modules/zone.js/dist/zone-testing.js?:712:39)
        at ProxyZoneSpec.onInvoke (webpack:///./node_modules/zone.js/dist/zone-testing.js?:284:39)
        at ZoneDelegate.invoke (webpack:///./node_modules/zone.js/dist/zone.js?:386:32)
        at Zone.run (webpack:///./node_modules/zone.js/dist/zone.js?:137:43)
        at eval (webpack:///./node_modules/zone.js/dist/zone.js?:871:34)
        at ZoneDelegate.invokeTask (webpack:///./node_modules/zone.js/dist/zone.js?:420:31)
        at AsyncTestZoneSpec.onInvokeTask (webpack:///./node_modules/zone.js/dist/zone-testing.js?:696:25)
        at ProxyZoneSpec.onInvokeTask (webpack:///./node_modules/zone.js/dist/zone-testing.js?:315:39)
        at ZoneDelegate.invokeTask (webpack:///./node_modules/zone.js/dist/zone.js?:420:31)
        at AsyncTestZoneSpec.onInvokeTask (webpack:///./node_modules/zone.js/dist/zone-testing.js?:696:25)
        at ProxyZoneSpec.onInvokeTask (webpack:///./node_modules/zone.js/dist/zone-testing.js?:315:39)
    error properties: Object({ rejection: TypeError: Cannot read property 'nativeElement' of null, promise: [object Promise], zone: Zone({ _properties: Object({ ProxyZoneSpec: ProxyZoneSpec({ defaultSpecDelegate: null, name: 'ProxyZone', properties: <circular reference: Object>, propertyKeys: null, lastTaskState: Object({ microTask: false, macroTask: true, eventTask: true, change: 'microTask' }), isNeedToTriggerHasTask: false, tasks: [ ZoneTask({ _zone: <circular reference: Object>, runCount: 0, _zoneDelegates: [ ZoneDelegate({ _taskCounts: Object, zone: <circular reference: Object>, _parentDelegate: ZoneDelegate, _forkZS: <circular reference: Object>, _forkDlgt: ZoneDelegate, _forkCurrZone: <circular reference: Object>, _interceptZS: <circular reference: Object>, _interceptDlgt: ZoneDelegate, _interceptCurrZone: <circular reference: Object>, _invokeZS: <circular reference: Object>, _invokeDlgt: ZoneDelegate, _invokeCurrZone: <circular reference: Object>, _handleErrorZS: <circular reference: Object>, _h ...
    Error: Uncaught (in promise): TypeError: Cannot read property 'nativeElement' of null
        at resolvePromise (webpack:///./node_modules/zone.js/dist/zone.js?:813:31)
        at eval (webpack:///./node_modules/zone.js/dist/zone.js?:876:17)
        at ZoneDelegate.invokeTask (webpack:///./node_modules/zone.js/dist/zone.js?:419:36)
        at Zone.runTask (webpack:///./node_modules/zone.js/dist/zone.js?:187:47)
        at drainMicroTaskQueue (webpack:///./node_modules/zone.js/dist/zone.js?:594:35)

Я уже пробовал несколько разныхподходит с fakeAsync и tick () и без async с разными вариациями - с тем же или схожим результатом, как показано выше.

Есть ли у кого-нибудь совет для меня, как это сделать правильно?

ОБНОВЛЕНИЕ: я создал Stackblitz , чтобы воссоздать проблему

...