2016-12-26 3 views
3

У меня возникли проблемы с тестированием одного из моих компонентов. Тест выглядит следующим образом:Angular2/Jasmine Ожидаем быть нулевым Ошибка браузера

describe('SmpEventsNewCompactEventComponent',() => { 

    const specService: SmpSpecService = new SmpSpecService(); 

    describe('Component rendering',() => { 
    let componentInstance: any; 
    let componentFixture: ComponentFixture<any>; 
    let cssSelector: string; 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
     imports: [ 
      MaterialModule.forRoot() 
     ], 
     declarations: [ 
      SmpEventsCompactEventComponent, 
      SmpEventsAddressComponent 
     ], 
     providers: [ 
      { provide: SMP_OT_HELPER, useValue: newOtHelperInstance() }, 
      DatePipe, 
      SmpEventTypeCheckerService, 
      SmpLangService 
     ] 
     }); 

     componentFixture = TestBed.createComponent(SmpEventsCompactEventComponent); 
     componentInstance = componentFixture.componentInstance; 
    }); 

    describe('Global',() => { 
     it('GIVEN there are date/time AND address ' + 
     'WHEN component loads THEN display event',() => { 
      //// TEST ONE 
      componentInstance.isEventEnabled = true; 
      cssSelector = '.events-compact-event'; 

      let debugElement = specService.queryDebugElement(
      componentFixture, cssSelector); 

      expect(debugElement).not.toBeNull(); 
     }); 

     it('GIVEN there are no date/time AND no address ' + 
     'WHEN component loads THEN do not display event',() => { 
      //// TEST TWO 
      componentInstance.isEventEnabled = true; 
      //componentInstance.isAddressEnabled = false; 
      // componentInstance.isDateEnabled = false; 
      cssSelector = '.events-compact-event'; 

      let debugElement = specService.queryDebugElement(
      componentFixture, cssSelector); 

      console.log('--------------', debugElement.nativeElement); 
      // expect(debugElement.nativeElement).toBe(null); 
      // expect(true).toBe(true); 
      expect(debugElement).not.toBeNull(); 
     }); 
    }); 
}); 

specService.queryDebugElement выглядит следующим образом:

queryDebugElement(fixture: ComponentFixture<any>, cssSelector: string): DebugElement { 
    fixture.detectChanges(); 

    return fixture.debugElement.query(By.css(cssSelector)); 
    } 

Всякий раз, когда я использую

expect(true).toBe(true); 

или

expect(debugElement.nativeElement).toBe(null); 

или

expect(debugElement).not.toBeNull(); 

в ИСПЫТАНИЯ ДВУХ, тесты работает или не нормально, но всякий раз, когда я использую

expect(debugElement).toBeNull(); 

Браузер, используемый при аварии карма (протестировано с хром/хром/PhantomJs) и не дает никакого понятия о том, что происходит. Это не просто «ожидать, что ложь, чтобы быть правдой» терпит неудачу, тестовый контекст завершается крахом.

Вы видите что-нибудь, что могло бы объяснить это поведение?

ответ

2

использование expect(debugElement).toBeTruthy(); вместо expect(debugElement).not.toBeNull() потому not.tobeNull() не может вести себя, как и ожидалось, когда что-то идет не определено. Если ваш debugElement не определен, это может создать проблемы.

+0

Хорошо ТНХ, будет делать :) – Shireilia

+0

Но вы знаете, как может ли он сбой, если debugElement определен? Потому что я, по крайней мере, ожидал бы журнал ошибок или что-то, если элемент с debugElement нарушен, а не сбой браузера. – Shireilia

+0

Я думаю, что ваш, кроме (debugElement), бросает ошибку. – saurav1405

6

Угловой-х DebugElement представляет собой достаточно сложный объект, и Жасмин expect, кажется, содержащими рекурсивные части (или, по крайней мере, алгоритмы, которые достаточно сложны, чтобы нуждаться во многих различных вызовах функциев) ... следовательно, использование DebugElement непосредственно в модульных тестах не рекомендуется. Обычно это заканчивается глубокой рекурсией и утечками памяти из браузера.

В вашем случае, я хотел бы попробовать:

let nl: NodeList = componentFixture.nativeElement.querySelectorAll('.events-compact-event'); 

expect(nl.length).toBeFalsy; 

Таким образом, вы не используете DebugElement, и вы не в опасности иметь неопределенные значения в тестах (кроме тех, которые вы делаете должны быть неопределенными). Покрытие кода и результаты должны быть эквивалентными.

Посмотрите на эту статью: https://medium.com/@martatatiana/poor-detective-angular2-browser-crash-and-debugelement-f0a651dbf33

+0

Спасибо Rom за предложение, я только что прошел через эту статью неделю назад или около того. Но это раздражает, чтобы не использовать DebugElement правильно, эта функция довольно приятная imo. Я дам вашему решению попробовать, посмотрим, может ли он дать лучшие результаты. – Shireilia

0

expect(Boolean(debugElement)).toBeTruthy() Использование вместо

  • expect(debugElement).not.toBeNull()
  • или expect(debugElement).toBeTruthy()
+0

Это способ исправить это, но мне кажется, что он немного взломан. То, что я делал в тестах, так как это сообщение было просто не проверять непосредственно на элементе debug, а на таких подзадачи, как debugElement.nativeElement, и все мои проблемы исчезли :) – Shireilia

 Смежные вопросы

  • Нет связанных вопросов^_^